HTTP状态500 - java.lang.LinkageError

时间:2016-03-15 05:52:32

标签: java spring maven

我正在使用spring框架和使用maven工具在java中开发一个MVC Web应用程序。

运行我的应用程序时出现以下错误。

HTTP Status 500 - java.lang.LinkageError: loader constraint violation: when resolving method 
"org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(Ljavax/servlet/ServletConfig;)Lorg/apache/tomcat/InstanceManager;" the class loader (instance of org/apache/jasper/servlet/JasperLoader) of the current class, 
org/apache/jsp/redirect_jsp, and the class loader (instance of org/apache/catalina/loader/StandardClassLoader) for the method's defining class, 
org/apache/jasper/runtime/InstanceManagerFactory, have different Class objects for the type org/apache/tomcat/InstanceManager used in the signature

4 个答案:

答案 0 :(得分:2)

您的Web应用程序的WEB-INF/lib文件夹中有特定于服务器的jar文件。例如:jsp-api.jar,el-api.jar,servlet-api.jar等。如果你使用maven进行依赖管理,你需要删除所有这些。

删除后,如果您的代码中出现编译错误,则从Project属性中添加服务器运行时。

答案 1 :(得分:2)

是否有servlet-api.jar是war文件的一部分?请在部署期间将其删除,因为每个Web服务器都有自己的servlet-api实现。因此,只能在代码中使用它进行编译。

答案 2 :(得分:0)

根据您发布的错误,正在加载org / apache / jsp / redirect_jsp的类加载器以及类加载器 org / apache / jasper / runtime / InstanceManagerFactory,为org / apache / tomcat / InstanceManager类型提供了不同的Class对象,这意味着你在两个不同的类加载器中引用包含org.apache.tomcat.InstanceManager的jar,这些加载器有一个代表关系。类对象基于其完全限定的类名及其加载器是唯一的。

关于此类错误,这是一个非常好的article to read

您需要了解如何两次加载课程并修改设置,以便只加载一次。

答案 3 :(得分:0)

正如之前的帖子中所提到的,应该是你的项目(jsp-api,servlet-api,el-api等)中存在冲突的库,你需要将其排除在外。

如果您使用的是spring-boot,则需要在生成要在tomcat中部署的war时排除tomcat libs。

对于前。

<exclusion>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
<exclusion>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-el</artifactId>
</exclusion>