【问题标题】:Run web app in local tomcat fails with LinkageException在本地 tomcat 中运行 Web 应用程序失败并出现 LinkageException
【发布时间】:2013-03-01 04:30:36
【问题描述】:

将 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 有关,但这似乎不是问题:

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

【问题讨论】:

    标签: java jsp tomcat servlets


    【解决方案1】:

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

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

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

    【讨论】:

    • 在这种情况下,请检查 jars 的其余部分,并确保这些类不包含在其他任何地方。
    • “那些课程”你的意思是javax.servlet,对吧?
    • 根据thisel-api也需要去。是的,tomcat 的lib 目录中的任何内容都不应镜像到您的应用程序中,除非打算对其进行映射。
    【解决方案2】:

    问题是由于位数引起的。检查您正在使用哪位操作系统并为该位安装 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 时发生这种情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-29
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 2012-08-04
      • 2021-12-16
      相关资源
      最近更新 更多