0

このリンケージ エラーに問題があります。同じコードで動作するプロジェクトがあります。

this.plateformTransactionManager = new DataSourceTransactionManager();
this.plateformTransactionManager.setDataSource(dataSource);
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = plateformTransactionManager.getTransaction(def);

実行時のスタック トレース:

java.lang.LinkageError: loader constraint violation: when resolving method org.springframework.jdbc.datasource.DataSourceTransactionManager.getTransaction(Lorg/springframework/transaction/TransactionDefinition;)  Lorg/springframework/transaction/TransactionStatus;" the class loader    (instance of  org/apache/catalina/loader/WebappClassLoader) of the current class, com/as24/referentiel/daos/ExternalUserDAO, and the class loader (instance of  rg/apache/catalina/loader/StandardClassLoader) for resolved class,  org/springframework/jdbc/datasource/DataSourceTransactionManager, have different Class Objects for the type org/springframework/transaction/TransactionDefinition used in the Signature

Maven依存関係エラーだと読みましたが、バージョン3.0.7.REALEASEでのみSpringを使用しました

Web上で解決策が見つかりません...

4

1 に答える 1

0

これは、サーバーと Web アプリケーション間の共有ライブラリの問題です。

Java では、クラスはその名前(パッケージ名を含む) とそのクラス ローダー(それをロードした) によって識別されます。したがって、MyBean.classWeb アプリケーション内WEB-INF/classesと内に同じものがある場合${catalina.home}/lib、これらは 2 つの異なるクラス (つまりmyBean instanceof MyBean == false) として表示されます。一部のクラスがメソッド シグネチャでクラスXYZを使用している状況に JVM が近づくと、現在のクラス ローダーが認識しているクラスXYZとは異なるクラスローダーによってXYZがロードされ、 thenが発生します。LinkageError


問題は、Spring の依存関係 (少なくともspring-tx ) が共有/システム クラス ローダーと Web アプリケーションの依存関係内にあることです。

問題を解決するには、次のいずれかを実行する必要があります。

  • サーバーのクラスローダーから Spring の依存関係を削除する
  • 重複する依存関係を Web アプリケーションから削除します ( providedPOM で依存関係としてマークします)。
  • class-loaderに重複した依存関係を追加endorsedします (これにより、Web アプリケーションの class-loader は Web アプリケーションの依存関係を無視します)。
于 2013-07-16T09:22:34.040 に答える