0

将 Web 应用程序部署到本地 tomcat(在 eclipse 中)时,启动失败并出现以下错误:

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

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

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

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

WEB-INF/lib JAR

那里没有“javax.*” jar,那么为什么该包中的类会失败?

4

2 回答 2

4

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

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

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

于 2013-03-13T10:00:11.520 回答
1

问题是由于位数引起的。检查您正在使用哪位操作系统并为该位安装 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 更改为 64 时有时候是这样的。

于 2013-03-22T04:44:14.587 回答