当我尝试在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
图书馆之间存在冲突,但我不知道它们是哪个。我怎样才能弄明白并解决它?
答案 0 :(得分:55)
当您在Web应用程序的/WEB-INF/lib
中包含不同服务器品牌/版本的服务器特定库时,会发生这种情况,例如jsp-api.jar
,el-api.jar
,{{1}您需要删除所有内容。 servlet-api.jar
不应包含任何特定于服务器的库。它们属于特定的服务器本身(Tomcat已将它们放在/WEB-INF/lib
文件夹中)。
这是一个非常常见的初学者的错误,只要他们在IDE项目中遇到JSP / Servlet API的编译错误。这应该以不同的方式解决,即通过在IDE中集成服务器并将服务器作为“目标运行时”添加到项目中。
答案 1 :(得分:16)
您有两种方法可以添加到项目库,例如jsp-api.jar
,el-api.jar
,servlet-api.jar
等:
Java Build Path
; provided
范围,例如:<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.jar
或javax-servlet-api.jar
jsp-api.jar
或javax-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插件。删除了依赖项,只在其中保留了插件,它就起作用了。