29

当我尝试在 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,但我不知道它们是哪个。我怎样才能弄清楚它们并解决它?

4

6 回答 6

58

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

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

也可以看看:

于 2011-12-13T12:04:02.933 回答
16

您有两个选项可以添加到您的项目库中,例如jsp-api.jar, el-api.jar,servlet-api.jar等:

  1. 将这些库作为外部 jar 添加到您的Java Build Path;
  2. 将它们添加为 maven 依赖项,provided为每个依赖项设置范围,例如:
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.1</version>
    <scope>provided</scope>
</dependency>
于 2013-02-08T15:10:04.027 回答
3

我被这个错误困扰了很长时间,这个线程节省了我很多时间。添加一些我在解决此问题之前所做的研究。是的,我们需要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>
于 2014-06-10T18:04:31.090 回答
2

检查此页面

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

找出你用过的罐子。如果找到两个,请删除一个。:)

于 2011-12-13T10:57:29.653 回答
0

这是我遇到的奇怪错误

经过研究,我发现了这个原因和解决方案

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

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

但这与我的 TOMCAT 服务器不兼容所以只需从我的构建路径和部署程序集中删除这两个 jar 现在我转到我的“E:\Locker\Software\apache-tomcat-6.0.44\lib”我的 Tomcat 服务器在哪里并将这两个罐子添加到我的项目中

servlet-api.jar
jsp-api.jar
于 2015-07-01T08:06:05.377 回答
0

就我而言,我有 tomcat 依赖项以及 POM 中提到的 tomcat 插件。删除了依赖项,只留下了插件,它可以工作。

于 2019-08-11T08:34:01.957 回答