使用LinkageException在本地tomcat中运行Web应用程序失败

时间:2013-03-13 09:55:14

标签: java jsp tomcat servlets

将Web应用程序部署到本地tomcat(在eclipse中)时,启动会出现此错误:

  

SEVERE:将上下文初始化事件发送到类com.sun.faces.config.ConfigureListener的侦听器实例的异常

     

java.lang.LinkageError:加载器约束违规:解析接口方法时“javax.servlet.jsp.JspApplicationContext.addELResolver(Ljavax / el / ELResolver;)

     

当前类的类加载器(org / apache / catalina / loader / WebappClassLoader的实例),com / sun / faces / config / ConfigureListener,以及类加载器(org / apache / catalina / loader / StandardClassLoader的实例) )对于已解析的类,javax / servlet / jsp / JspApplicationContext,具有类型为p.JspApplicationContext.addELResolver的不同Class对象(Ljavax / el / ELResolver;)

这里发生了什么?我已经读过它可能与WEB-INF / lib中的servlet jar有关,但这似乎不是问题所在:

WEB-INF/lib JARs

那里没有“javax。*”jar,为什么这个包中的类失败了呢?

2 个答案:

答案 0 :(得分:3)

从您的应用程序中删除servlet-api。这永远不应该在webapp分发中。

Tomcat(或任何容器)必须从其自己的类路径中提供这些类,以便不对类的多个实例进行类加载。

如果您使用的是maven,则需要provided依赖。

答案 1 :(得分:1)

问题是由于比特造成的。检查您正在使用的OS位,并为该位安装jre。因为tomcat是一个java应用程序,它没有位。这意味着它可以在64位和32位上运行。

可以安装64位和32位版本的Java。如果Tomcat 7安装程序发现(仅)安装了Java 7 32位,则它会将tomcat 7安装到Program files(x86)目录中。但Tomcat 7安装程序将选择64位版本的Java,并将其自身安装到Program Files文件夹中。

但是你不能假设Tomcat 7在这种情况下使用64位Java,因为用户在安装tomcat 7之后可能已经添加了64位Java,并且tomcat 7不知道从32改变它的'bitness'发生这种情况时到64岁。