动态加载类的GWT web-app vs系统类路径



在我的GWT web应用程序中,我将所有jar文件保存在我的项目之外,并使用类路径变量引用它们。这允许我链接到其他项目/团队的jar,而不必把jar的副本放在我的web app lib目录中。托管模式友好地查找这个系统类路径中的类,然后将它们添加到web-app类路径中,警告我它正在这样做。当我部署我的构建系统时,只拉入我需要在我的web应用程序中发布的jar,这不是问题。

我的问题是,一些代码使用动态查找,搜索类路径的实现。如果一个jar还没有被添加到web应用程序的类路径中,因为还没有从jar中加载类,那么它不会被包含在搜索中。

我遇到的特殊问题是持久性-它通过搜索META-INF/services文件来查找EntityManagerFactory实现。我也有一个类似的问题与罗马和它的模块扩展。

我有一个解决方案,在开发/托管模式下,我只是参考一个类,我知道是在一个jar我想要的,这导致它被添加到我的web应用程序类路径。我通过调用

来实现这一点
private void devModeClassPathHack() {
    Class<?> gwtDevModeHack1 = EntityManagerImpl.class;
}

from my development mode Guice module.

我的问题很简单——有没有一种"更好"的方式来做这件事?

我不认为有更好的方法-使用GWT Jetty/dev模式的这种临时的"自我修复"机制已经是一个hack了:)如果您曾经需要在开发期间在JBoss上运行服务器端代码(与客户端GWT开发模式一起),这将停止工作。

(另一个问题是,类加载的顺序——以及在不同的jar中有多个版本的类时的优先级——将取决于程序流。这在调试时非常麻烦。)

你提到,你把所有的罐子从外面拉进来。在这种情况下,我要做的是将WEB-INF/lib目录中的.svnignore(或.gitignore/…)设置为"*.jar"。然后,我将运行用于创建生产构建的相同构建步骤,在启动服务器之前将jar复制到lib目录中。

最新更新