0

我已经设置了一个 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>
4

1 回答 1

0

jboss-deployment-structure.xml需要是 EAR 的 in目录META-INFsrc/main/resources/META-INF如果您的 Maven 项目,它应该在目录中。

于 2013-08-14T15:41:41.180 回答