1. ホーム
  2. java

[解決済み] loader constraint violation [duplicate] (ローダー制約違反)。

2022-02-05 18:40:30

質問

同じ.jar(私の場合はel-api.jar v2.1)が1つのプロジェクトに2つあるという問題に遭遇し、Tomcat 6を使ってプロジェクトを実行しようとすると、以下のエラースタックが表示されます。

WARNING: Unexpected error forwarding to login page
javax.servlet.ServletException: java.lang.LinkageError: loader constraint violation: when resolving interface method "javax.servlet.jsp.JspApplicationContext.getExpressionFactory()Ljavax/el/ExpressionFactory;" the class loader (instance of org/apache/jasper/servlet/JasperLoader) of the current class, org/apache/jsp/login_jsp, and the class loader (instance of org/apache/catalina/loader/StandardClassLoader) for resolved class, javax/servlet/jsp/JspApplicationContext, have different Class objects for the type javax/el/ExpressionFactory used in the signature

 at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.LinkageError: loader constraint violation: when resolving interface method "javax.servlet.jsp.JspApplicationContext.getExpressionFactory()Ljavax/el/ExpressionFactory;" the class loader (instance of org/apache/jasper/servlet/JasperLoader) of the current class, org/apache/jsp/login_jsp, and the class loader (instance of org/apache/catalina/loader/StandardClassLoader) for resolved class, javax/servlet/jsp/JspApplicationContext, have different Class objects for the type javax/el/ExpressionFactory used in the signature

を発見しました。 http://blog.springsource.com/2008/10/20/understanding-the-osgi-uses-directive/

しかし、この解決策は私のプロジェクトの多くの部分に影響を与えるため、役に立ちません。

このプロジェクトは他の多くのユーザーが使用するため、Tomcatにも変更を加えることができません。

現在の対処法は、Tomcat6を使用してビルドするたびに、el-api.jarを手動で削除することです。その後、他のもののために要求される.jarを戻す必要があります。

Maven 2とMaven 3を使ってビルドしています。(ところで、JrubyでMaven3を使うことについて知っている人はいますか?)

この問題について、どなたか教えてください。

解決方法を教えてください。

<ブロッククオート

同じ.jar(私の場合はel-api.jar v2.1)が1つのプロジェクトに2つあるため、Tomcat 6を使ってプロジェクトを実行しようとすると、以下のエラースタックが発生する問題が発生しました。

次に、el-api.jar のアーティファクトを次のようにマークします。 provided である場合は、そのようにします。

現在の対処法は、Tomcat6を使用するビルドを行うたびにel-api.jarを手動で削除することです。その後、他のもののために要求される.jarを戻す必要があります。

これを処理するもっと良い方法は、プロファイルの中で依存関係を宣言し、それを provided (例えば、"tomcat6" プロファイルの場合) 必要に応じて、そうするかしないかを選択します。