我已经设置了一个部署到JBoss服务器的GWT应用程序,并且(通常)根据需要执行。它基于Maven,分为服务器和Web模块。自从我最近被介绍到Guava库以来,由于它的GWT兼容性,我决定将它包含在我的项目中。
尝试从服务器向Web发送Guava类的可选对象时,我不幸地忍受了jBoss控制台上出现的以下错误消息:
调度传入的RPC调用时发生异常:
com.google.gwt.user.server.rpc.UnexpectedException:服务方法'public abstract com.google.common.base.Optional com.company.project.client.rpc.ProjectService.getSearchWords(java.lang.String )'抛出一个意想不到的例外:
java.lang.LinkageError:加载器约束违规:解析接口方法时“com.company.project.service.ProjectController.getSearchWords(Ljava / lang / String;)Lcom / google / common / base / Optional;”
当前类的类加载器(org / jboss / modules / ModuleClassLoader的实例),com / company / project / server / ProjectServlet,以及用于已解析类的类加载器(org / jboss / modules / ModuleClassLoader的实例) ,com / company / project / service / ProjectController,具有类型为va / lang / String的不同Class对象;)Lcom / google / common / base / Optional;用于签名
这是ProjectService.java文件中包含的行:
Optional<Set<String>> getSearchWords( String token );
ProjectController.java中的模拟方法签名(它是ProjectControllerBean.java的接口)看起来是一样的。
此问题仅与Guava类“Optional”一起发生。任何其他RPC方法都可以正常工作。
有没有人知道可能会发生什么以及如何解决这个问题?我真的很高兴得到任何帮助!
提前致谢。
编辑#1
我想这可能与jboss提供可能通过ModuleClassLoader加载的Guava库的过时版本有关。但不幸的是,我一直无法通过jboss-deployment-structure.xml禁用该自动化:(
我将该文件放入我的EAR的src / main / application中,其中包含以下内容:
<jboss-deployment-structure>
<deployment>
<exclusions>
<module name="com.google.guava" />
</exclusions>
</deployment>
<sub-deployment name="project-server.jar">
<exclusions>
<module name="com.google.guava" />
</exclusions>
</sub-deployment>
</jboss-deployment-structure>
答案 0 :(得分:0)
jboss-deployment-structure.xml
必须是EAR的META-INF
目录。如果您的maven项目,它应该在src/main/resources/META-INF
目录中。