正确的解决方法" javax.servlet.ServletException:java.lang.LinkageError:加载器约束违规"?

时间:2014-07-16 06:01:21

标签: java tomcat

我将我的war文件(在tomcat 7环境中运行)移动到tomcat 6环境。然后我得到了这个异常。作为解决方案,我尝试了This answer。但仍然没有好处!我想在只有tomcat 6的远程机器上运行。请帮帮我..

异常

 javax.servlet.ServletException: java.lang.LinkageError: loader constraint violation: loader (instance of org/apache/catalina/loader/WebappClassLoader) previously initiated loading for a different type with name "javax/el/ExpressionFactory"
        org.apache.jasper.servlet.JspServlet.service(JspServlet.java:268)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238)
        org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250)
        org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1047)
        org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:817)
        org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
        org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
        org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

    root cause

    java.lang.LinkageError: loader constraint violation: loader (instance of org/apache/catalina/loader/WebappClassLoader) previously initiated loading for a different type with name "javax/el/ExpressionFactory"
        java.lang.ClassLoader.defineClass1(Native Method)
        java.lang.ClassLoader.defineClass(ClassLoader.java:800)
        java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2331)
        org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:976)
        org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1451)
        org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1329)
        org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:128)
        org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:66)
        java.lang.Class.getDeclaredFields0(Native Method)
        java.lang.Class.privateGetDeclaredFields(Class.java:2397)
        java.lang.Class.getDeclaredFields(Class.java:1806)
        org.apache.catalina.util.DefaultAnnotationProcessor.processAnnotations(DefaultAnnotationProcessor.java:181)
        org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:148)
        org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:329)
        org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
        org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238)
        org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250)
        org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1047)
        org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:817)
        org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
        org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
        org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

2 个答案:

答案 0 :(得分:1)

您在classpath中有两种版本的表达式语言。您的应用加载的版本与您的服务器不兼容。看一下名为javax.el-api,commons-el或jboss-el-api等的文件。尝试从你的应用程序中删除它,因为Tomcat会自己发送。

答案 1 :(得分:0)

很长一段时间我都遇到了这个错误。在解决这个问题之前,我做了一些研究。是的,我们需要从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>