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

时间:2011-12-13 09:42:58

标签: jsp tomcat servlets linkageerror

当我尝试在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)

似乎两个.jar图书馆之间存在冲突,但我不知道它们是哪个。我怎样才能弄明白并解决它?

6 个答案:

答案 0 :(得分:55)

当您在Web应用程序的/WEB-INF/lib中包含不同服务器品牌/版本的服务器特定库时,会发生这种情况,例如jsp-api.jarel-api.jar,{{1}您需要删除所有内容。 servlet-api.jar不应包含任何特定于服务器的库。它们属于特定的服务器本身(Tomcat已将它们放在/WEB-INF/lib文件夹中)。

这是一个非常常见的初学者的错误,只要他们在IDE项目中遇到JSP / Servlet API的编译错误。这应该以不同的方式解决,即通过在IDE中集成服务器并将服务器作为“目标运行时”添加到项目中。

另见:

答案 1 :(得分:16)

您有两种方法可以添加到项目库,例如jsp-api.jarel-api.jarservlet-api.jar等:

  1. Java Build Path;
  2. 中将这些库添加为外部jar
  3. 将它们添加为maven依赖项,为每个依赖项设置provided范围,例如:
  4. <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.1</version>
        <scope>provided</scope>
    </dependency>
    

答案 2 :(得分:2)

查看此页

http://www.jarfinder.com/index.php/java/info/org.apache.jasper.runtime.HttpJspBase

找出您在此使用的罐子。如果你找到两个,请删除。:)

答案 3 :(得分:2)

我被这个错误困住很长一段时间,这个线程节省了我很多时间。在解决这个问题之前,我做了一些研究。是的,我们需要从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>

答案 4 :(得分:0)

这是我遇到过的奇怪的错误

研究后我发现了这个原因和解决方案

我正在使用Spring,所以在我的@spring库中我已经有了像

这样的jar

Servlet-api.jarjavax-servlet-api.jar jsp-api.jarjavax-servlet-jsp.jar

但这与我的TOMCAT服务器不兼容 所以我只需从构建的路径和部署程序集中删除这两个jar 现在我转到我的 “E:\衣柜\ SOFTWARE \ Apache的Tomcat的6.0.44 \ LIB” 我的Tomcat服务器在哪里,并将这两个jar添加到我的项目

servlet-api.jar
jsp-api.jar

答案 5 :(得分:0)

就我而言,我有tomcat依赖项以及POM中提到的tomcat插件。删除了依赖项,只在其中保留了插件,它就起作用了。