1

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

在我的情况下,我的 Java EE Web 项目中的 LinkageError 遇到了很大的麻烦:

问题

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

奇怪的方式是在添加一个实现带有 faces 事件参数的函数的 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"

(删除参数允许构建项目没有错误)

问题

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

4

1 回答 1

2

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

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

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

有关详细信息,请参阅WildFly 中的类加载。

于 2014-05-13T21:43:34.457 回答