WildFly 8 / JBoss:调试Java EE类加载器链接错误的一般方法

时间:2014-05-13 08:57:22

标签: java-ee jboss wildfly wildfly-8 linkageerror

调试这些问题的正确方法是什么?

在我的案例中,我在Java EE Web项目中遇到了LinkageError的大问题:

问题

我将JSF API(jboss-jsf-api_2.2_spec-2.2.5.jar)包含到我的wildfly模块目录中,即它将由Wildfly类加载器加载。 我有外部库也依赖于JSF实现(例如Primefaces和OmniFaces)。 另外,为了让构建过程正常运行,我必须将库添加为单独的EAR库。

奇怪的方式是添加一个实现具有面事件参数的函数的bean,例如

public void myValueChangeListener(ValueChangeEvent e) {
 // do sth. 
}

实施这些功能会导致......

10:22:18,571 WARN  [org.jboss.modules] (MSC service thread 1-1) Failed to define class javax.faces.event.ValueChangeEvent in Module "javax.faces.api:main" from local module loader @468a169f (finder: local module finder @13d344e7 (roots: /home/user/app-server/wildfly8/modules,/home/user/app-server/wildfly8/modules/system/layers/base)): java.lang.LinkageError: loader constraint violation: loader (instance of org/jboss/modules/ModuleClassLoader) previously initiated loading for a different type with name "javax/faces/event/ValueChangeEvent"

......我的SEVERE的起点

10:22:18,578 SEVERE [javax.enterprise.resource.webcontainer.jsf.config] (MSC service thread 1-1) Critical error during deployment: : java.lang.LinkageError: loader constraint violation: loader (instance of org/jboss/modules/ModuleClassLoader) previously initiated loading for a different type with name "javax/faces/event/ValueChangeEvent"

(删除参数可以无错误地构建项目)

问题

如何应对这些问题?我需要一个关于类加载顺序的概述。可能有一种方法可以显示整个类加载器树或任何可以执行相同操作的分析工具。

1 个答案:

答案 0 :(得分:2)

您可以在JBoss模块上启用调试或跟踪日志记录,但这必然会有太多信息。

在您的情况下,为什么要添加一个模块(即jboss-jsf-api_2.2_spec-2.2.5.jar),无论如何都包含在WildFly中(与8.0.0.Final完全相同的版本)?这就是模块加载器抱怨重复类的原因。

WildFly部署有一个隐式模块依赖项列表(包括用于JSF部署的jsf-api)。如果您需要WildFly发行版中的其他依赖项,则应该简单地声明该依赖项而不是复制模块。

有关详细信息,请参阅Class Loading in WildFly