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

时间:2011-09-16 09:04:10

标签: java gwt classpath

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

我遇到的问题是某些代码使用动态查找,在类路径中搜索实现。如果尚未将jar添加到Web应用程序类路径中,那么尚未从jar中加载任何类,它不会包含在搜索中。

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

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

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

来自我的开发模式Guice模块。

我的问题很简单 - 有没有“更好”的方法呢?

1 个答案:

答案 0 :(得分:1)

我不认为,有一个更好的方法 - 使用GWT Jetty / dev模式的临时“自我修复”机制已经是一个黑客:)如果你有需要运行服务器端代码e。 G。 JBoss在开发过程中(与客户端的GWT开发模式一起),这将停止工作。

(作为一个额外的问题,类加载的顺序 - 以及因此在不同jar中有多个版本的类的情况下的优先级 - 将取决于程序流。这可能非常讨厌调试。)

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