我已经设置了一个 GWT 应用程序,该应用程序部署到 JBoss 服务器并(通常)按要求执行。它基于 Maven,分为服务器和 Web 模块。由于我最近被介绍到 Guava 库,并且由于它的 GWT 兼容性,我决定将它包含在我的项目中。
在尝试将 Guava 类 Optional 的对象从服务器发送到 Web 时,不幸的是我忍受了 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;”时
当前类 com/company/project/server/ProjectServlet 的类加载器(org/jboss/modules/ModuleClassLoader 的实例)和已解析类 com/ 的类加载器(org/jboss/modules/ModuleClassLoader 的实例) 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 类“可选”一起发生。任何其他 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>