2014-05-13 32 views
1

調試這些問題的正確方法是什麼?WildFly 8/JBoss:調試Java EE類加載器鏈接錯誤的一般方法

在我來說,我有一個LinkageError類我的Java EE Web項目中大規模的煩惱:

問題

我包括JSF API(JBoss的,JSF的api_2.2_spec-2.2.5.jar )放到我的wildfly模塊目錄中,即它將由Wildfly classloader加載。 我有外部庫也依賴於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" 

...起點對我的嚴重

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" 

(除去參數允許建立一個沒有錯誤的項目)

問題

如何應對這樣的問題?我需要關於類加載順序的概述。可能有一種方法可以顯示整個類加載器樹或任何將執行相同操作的分析工具。

回答

2

您可以在JBoss模塊上啓用調試或跟蹤日誌記錄功能,但這肯定是太多的信息。

在你的情況下,爲什麼你要添加一個包含在WildFly中的模塊(即jboss-jsf-api_2.2_spec-2.2.5.jar)(在8.0.0.Final中完全一樣)?這就是爲什麼模塊加載器抱怨重複的類。

WildFly部署的隱式模塊依賴關係列表(其中包括JSF部署的jsf-api)。如果您需要WildFly發行版中的其他依賴項,則應該簡單地聲明該依賴項,而不是複製該模塊。

查看Class Loading in WildFly瞭解更多詳情。

+0

那麼,你是對的,不要手動添加庫到項目中。另一個問題是業務邏輯和Web層之間缺少分離。現在我刪除了特定的jsf實現,但當我嘗試在動作偵聽器實現中捕獲我的事件時,由於類加載錯誤,我的bean未在部署過程中實例化:從[Module「deployment.myApp輸入javax.faces.event.ValueChangeEvent .ear.appCore.jar:main「from Service Module Loader]找不到。 –