【问题标题】:Tomcat 7 java.lang.NoClassDefFoundError: javax/el/ELManager [duplicate]Tomcat 7 java.lang.NoClassDefFoundError:javax/el/ELManager [重复]
【发布时间】:2018-08-29 07:53:39
【问题描述】:

我想将我的应用程序部署到版本 7 中的 tomcat,我得到以下异常 java.lang.NoClassDefFoundError: javax/el/ELManager 但是,如果我尝试将此应用程序部署到 tomcat 版本 8,它就可以正常工作。

你有什么办法解决这个问题吗?

为什么要从tomcat 8 切换到 7?在测试环境中,repo 中是 tomcat 8,在服务器上是 tomcat7。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>certplatform</groupId>
<artifactId>certplatform</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
  <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.7.0</version>
    <configuration>
      <source>1.8</source>
      <target>1.8</target>
    </configuration>
  </plugin>
  <plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>3.0.0</version>
    <configuration>
      <warSourceDirectory>WebContent</warSourceDirectory>
    </configuration>
  </plugin>
</plugins>
</build>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring- 
core -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.0.4.RELEASE</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring- 
context -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.0.4.RELEASE</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring- 
context-support -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>5.0.4.RELEASE</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring- 
webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.0.4.RELEASE</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-web 
-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.0.4.RELEASE</version>
</dependency>

<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

<!--https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/javax.servlet.jsp.jstl-api -->
<dependency>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>javax.servlet.jsp.jstl-api</artifactId>
    <version>1.2.1</version>
</dependency>

<!-- https://mvnrepository.com/artifact/javax.mail/mail -->
<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.5.0-b01</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator -->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.8.Final</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.2.15.Final</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager -->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>5.2.15.Final</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.2.1</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on -->
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.59</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcpkix-jdk15on -->
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcpkix-jdk15on</artifactId>
    <version>1.59</version>
</dependency>   

<!-- https://mvnrepository.com/artifact/javax.el/javax.el-api -->
<dependency>
    <groupId>javax.el</groupId>
    <artifactId>javax.el-api</artifactId>
    <version>3.0.0</version>
</dependency>

<!-- https://mvnrepository.com/artifact/javax.el/el-api -->
<dependency>
    <groupId>javax.el</groupId>
    <artifactId>el-api</artifactId>
    <version>2.2</version>
</dependency>   

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">

<display-name>spring-mvc-demo</display-name>

<!-- Spring MVC Configs -->

<!-- Step 1: Configure Spring MVC Dispatcher Servlet -->
<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring-mvc-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<!-- Step 2: Set up URL mapping for Spring MVC Dispatcher Servlet -->
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

【问题讨论】:

  • 这个问题是由于这个类 javax/el/ELManager 是在 javax.el-api 版本 3.0 中引入的。 Tomcat 7 附带预捆绑的 el-api 2.2(缺少该类),它在运行时选择它,而不是你的 el-api jar。你可以访问Tomcat吗?可以升级吗?
  • 感谢您的信息。升级是可能的,但我不放心,tomcat 也将在下一个操作系统更新周期更新。是的,我可以访问 tomcat。
  • 最好尽可能同步您的开发/测试/生产环境。当您的测试环境具有 Tomcat 8 时,在 dev 中针对 Tomcat 8 进行开发更有意义。正如您发现 Tomcat 7 和 8 服务器带有不同的库集,因此您的代码可以针对这些不同的库集表现不同。
  • 我完全同意你的看法。我天真地认为 repos 包含相同的 rpm,但我错了。有没有可能解决这个问题?
  • 我在答案中总结了 cmets。

标签: java spring hibernate maven


【解决方案1】:

这个问题是由于 javax/el/ELManager 这个类是在 el-api 3.0 版中引入的。

Tomcat 7 is coming with pre-bundled el-api 2.2(缺少类),它在运行时选择它,而不是你的 el-api jar。

Tomcat 8 has the el-api 3.0 因此存在javax/el/ELManager 类。

最好尽可能同步您的开发/测试/生产环境。

当您的测试环境具有 Tomcat 8 时,在 dev 中针对 Tomcat 8 进行开发会更有意义。正如您发现 Tomcat 7 和 8 服务器带有不同的库集,因此您的代码可以针对这些不同的集执行不同的行为图书馆。

【讨论】:

    【解决方案2】:

    如果您想在生产环境中在 Tomcat 7 上运行 webapp,那么您应该在测试环境中使用 Tomcat 7。

    发生的事情是您不小心引入了对 EL 3.0 API 的依赖项......并将其包含在您的 POM 文件中。它可以在 Tomcat 8 上找到。但在 Tomcat 7 上,该平台支持 EL 2.1。因此,当您的应用尝试加载 javax.el.ELManager 的类文件时,它会失败。

    解决方案:

    • 将您的生产平台升级到 Tomcat 8
    • 将您的开发和测试平台降级到 Tomcat 7,并从您的代码库中消除对较新 API 的任何依赖。

    Apache Tomcat Versions 页面列出了每个主要版本的 Tomcat 的各种规范版本。


    有没有可能解决这个问题?

    如果您准备“屠宰”Tomcat 7 服务器,您也许可以将 EL 实现替换为较新的实现。但我不会尝试这样做,因为 1)它可能根本不起作用,并且 2)结果可能难以维护。而且您有可能让您的运营、质量保证和/或安全团队陷入困境!

    是否有可能通过更改应用程序来解决此问题?

    AFAIK,不可能。

    我认为你可以尝试用这个替换 EL 依赖项:

    <dependency>
        <groupId>javax.el</groupId>
        <artifactId>javax.el-api</artifactId>
        <version>3.0.0</version>
    </dependency>
    

    但它不起作用。根据 Alex 的评论:

    “将 JAR 添加到应用程序 POM 并不能解决任何问题。这是由 Tomcat 引导程序打印出的消息:“validateJarFile(C:\Software\apache-tomcat-7.0.99\webapps\leonardo-flows -services\WEB-INF\lib\javax.el-api-3.0.0.jar) - jar 未加载。请参阅 Servlet 规范 3.0,第 10.7.2 节。违规类:javax/el/Expression.class"。它与它的 lib jar 冲突。"

    【讨论】:

    • 将 JAR 添加到应用程序 POM 并不能解决任何问题。这是Tomcat引导程序打印的消息:“validateJarFile(C:\Software\apache-tomcat-7.0.99\webapps\leonardo-flows-services\WEB-INF\lib\javax.el-api-3.0.0. jar) - jar 未加载。请参阅 Servlet Spec 3.0,第 10.7.2 节。违规类:javax/el/Expression.class"。它与其 lib jar 冲突。
    • 除了升级还有什么办法?
    • @sitakant - 降级测试平台。
    猜你喜欢
    • 2018-11-03
    • 1970-01-01
    • 2015-04-04
    • 2012-01-14
    • 2012-09-29
    • 1970-01-01
    • 2014-01-31
    • 2012-07-07
    • 1970-01-01
    相关资源
    最近更新 更多