web-dev-qa-db-ja.com

java.lang.LinkageError:javax.servlet.jsp.JspApplicationContext.getExpressionFactory

Tomcat 7でwebappを実行しようとすると、次の例外が発生しました。

exception

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/index_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
org.Apache.jasper.servlet.JspServlet.service(JspServlet.Java:343)
javax.servlet.http.HttpServlet.service(HttpServlet.Java:722)

root cause

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/index_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
org.Apache.jsp.index_jsp._jspInit(index_jsp.Java:31)
org.Apache.jasper.runtime.HttpJspBase.init(HttpJspBase.Java:49)
org.Apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.Java:180)
org.Apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.Java:369)
org.Apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.Java:390)
org.Apache.jasper.servlet.JspServlet.service(JspServlet.Java:334)
javax.servlet.http.HttpServlet.service(HttpServlet.Java:722)

2つの.jarライブラリーの間に矛盾があるようですが、どちらのライブラリーかはわかりません。どうすればそれらを把握して解決できますか?

29
Br3x

これは、/WEB-INF/libjsp-api.jarel-api.jarなど、Webアプリケーションのservlet-api.jarに異なるサーバーのメーカー/バージョンのサーバー固有ライブラリを含めると発生します。removeそれらすべてを削除する必要があります。 /WEB-INF/libにはサーバー固有のライブラリを含めないでください。それらは特定のサーバー自体に属します(Tomcatは既に/libフォルダーにあります)。

ちなみに、これはIDEプロジェクトでJSP/Servlet APIでコンパイルエラーが発生するたびに、かなり一般的な初心者の間違いです。これは別の方法で解決する必要があります。 IDEおよびサーバーを「ターゲットランタイム」としてプロジェクトに追加します。

こちらもご覧ください:

55
BalusC

プロジェクトライブラリに追加するには、jsp-api.jarel-api.jarservlet-api.jarなどの2つのオプションがあります。

  1. これらのライブラリをJava Build Pathの外部jarとして追加します。
  2. それらをMaven依存関係として追加し、それぞれにprovidedスコープを設定します。次に例を示します。
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.1</version>
    <scope>provided</scope>
</dependency>
16
vadim

このページをチェック

http://www.jarfinder.com/index.php/Java/info/org.Apache.jasper.runtime.HttpJspBase

これで使用したjarファイルを見つけます。 2つ見つかったら削除します。

2
Kris

私は非常に長い間このエラーに悩まされ、このスレッドは私の時間をかなり節約しました。この問題を解決する前に私が行ったいくつかの研究を追加します。はい、jsp-api.jar, el-api.jar, servlet-api.jarなどのライブラリを/WEB-INF/libフォルダーから削除する必要があります。しかし、どのように?

私の場合、Apache Ivyを依存関係マネージャーとして使用し、Spring MVCを使用しました。上記のライブラリとともにすべての依存関係をダウンロードします。実行時に、これらはTomcatライブラリによって提供されるAPIと競合します。単純な解決策は、これらのjarを依存関係から除外するか、構成を作成し、コンパイル時の構成のみにこれらのライブラリを含めることです。すぐにうまくいったのは、これらのライブラリを除外することです。

    <dependency org="org.springframework" name="spring-webmvc"
        rev="4.0.4.RELEASE">
        <exclude org="javax.servlet" name="javax.servlet-api" />
        <exclude org="javax.servlet.jsp" name="jsp-api" />
        <exclude org="javax.el" name="javax.el-api" />
    </dependency>
2
Aniket Thakur

私の場合、Tomcat依存関係とPOMで言及されているTomcatプラグインがありました。プラグインのみを残して依存関係を削除し、機能しました。

0
Yasser Khan

これは変なエラーです

研究の後、この原因と解決策を見つけました

私はSpringを使用しているので、私の@springライブラリにはすでにjarのようなものがあります

Servlet-api.jarまたはjavax-servlet-api.jarjsp-api.jarまたはjavax-servlet-jsp.jar

しかし、これはTomcatサーバーと互換性がないので、ビルドパスとデプロイメントアセンブリからこれらの2つのjarを削除するだけですTomcatサーバーがある「E:\ Locker\Software\Apache-Tomcat-6.0.44\lib」これらの2つのjarをプロジェクトに追加します

servlet-api.jar
jsp-api.jar
0