Java Maven 构建的 Wildfly 上的 LinkageError

Java LinkageError on Wildfly build by maven

我在 Wildfly 10.1 上的 EAR 项目中有一个 LinkageError。 该项目包含一个 ejb 和一个 web 子项目。 Maven 的依赖管理。 Gson 包被添加到父舞会和两个子项目的舞会中。

无法确定第二个 gson class 的加载位置。关于如何解决这个问题有什么建议吗?

15:02:14,242 ERROR [io.undertow.request] (default task-2) UT005023: 
Exception handling request to /Trigger-Server-web/event/quote:     
java.lang.LinkageError: loader constraint violation: when resolving 
interface method "de.company.triggerserver.ejb.EventProcessingLocal.processEvent(Ljava/lang/String;Lcom/google/gson/JsonObject;)Z" the class loader (instance of org/jboss/modules/ModuleClassLoader) of the current class, de/company/triggerserver/web/EventServlet, and the class loader (instance of org/jboss
/modules/ModuleClassLoader) for the method's defining class, de/company
/triggerserver/ejb/EventProcessingLocal, have different Class objects for the type com/google/gson/JsonObject used in the signature

此问题是由于在 WAR 文件的 EAR/lib 目录和 WEB-INF/lib 目录中都有 Gson jar 的副本引起的。

因此诀窍是删除 WAR 文件中的那个。

简单的解决方案是在网络模块的 pom.xml 文件中将其依赖项标记为 <scope>provided</scope>

一种更复杂的方法是利用 maven-ear-plugin 的能力来使用 "skinny WARS" 构建 EAR 文件,如 Creating Skinny WARs 中所述。这实质上是在 EAR 组装过程中从 Web 模块的 WEB-INF/lib 目录中删除了重复的 jar。

您可能会发现第二种方法更好,因为您的 EAR 文件构建中可能有多个其他 jar 的副本,而您将通过第一种方法一次发现这些。