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 的副本,而您将通过第一种方法一次发现这些。
我在 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 的副本,而您将通过第一种方法一次发现这些。