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 に答える