簡體   English   中英

java.lang.NoClassDefFoundError: javax/el/ELManager

[英]java.lang.NoClassDefFoundError: javax/el/ELManager

我正在使用 Spring Tool Suite 在 Spring 中開發 webapp。 如果我使用 IDE 在那里構建應用程序並將其部署到提供的 Pivotal tc Server 上,它就可以正常工作。 但是,如果我執行手動“mvn clean package”構建並嘗試將其部署到獨立的 Tomcat 服務器(使用最新的 Tomcat 7),則會引發以下異常:

2017-08-23 15:24:13 WARN  AnnotationConfigWebApplicationContext:551 - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerAdapter' defined in org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter]: Factory method 'requestMappingHandlerAdapter' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mvcValidator' defined in org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: javax/el/ELManager
2017-08-23 15:24:13 ERROR DispatcherServlet:502 - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerAdapter' defined in org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter]: Factory method 'requestMappingHandlerAdapter' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mvcValidator' defined in org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: javax/el/ELManager

經過進一步檢查,它確實抱怨上面沒有加載罐子的幾行:

sie 23, 2017 3:24:12 PM org.apache.catalina.startup.HostConfig deployWAR
INFO: Deploying web application archive D:\Apache-Tomcat-7.0\webapps\TestApp-0.0.1-SNAPSHOT.war
sie 23, 2017 3:24:12 PM org.apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(D:\Apache-Tomcat-7.0\webapps\TestApp-0.0.1-SNAPSHOT\WEB-INF\lib\el-api-2.2.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/el/Expression.class
sie 23, 2017 3:24:12 PM org.apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(D:\Apache-Tomcat-7.0\webapps\TestApp-0.0.1-SNAPSHOT\WEB-INF\lib\javax.servlet-api-3.1.0.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
sie 23, 2017 3:24:12 PM org.apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(D:\Apache-Tomcat-7.0\webapps\TestApp-0.0.1-SNAPSHOT\WEB-INF\lib\tomcat-el-api-8.0.21.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/el/Expression.class
2017-08-23 15:24:13 INFO  ContextLoader:304 - Root WebApplicationContext: initialization started

我的 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>com.exmaple.mvc</groupId>
  <artifactId>TestApp</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.3.10.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>4.3.10.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>4.3.10.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>4.3.10.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.6.6</version>
    </dependency>
    <dependency>
       <groupId>log4j</groupId>
       <artifactId>log4j</artifactId>
       <version>1.2.17</version>
       <exclusions>
        <exclusion>
            <artifactId>jms</artifactId>
            <groupId>javax.jms</groupId>
        </exclusion>
        <exclusion>
            <artifactId>jmxri</artifactId>
            <groupId>com.sun.jmx</groupId>
        </exclusion>
        <exclusion>
            <artifactId>jmxtools</artifactId>
            <groupId>com.sun.jdmk</groupId>
            </exclusion>
        </exclusions>
    </dependency>
        <dependency>
        <groupId>jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.mockito/mockito-all -->
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-all</artifactId>
        <version>1.9.5</version>
        <scope>test</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/commons-lang/commons-lang -->
    <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.3</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>6.0.1.Final</version>
    </dependency>

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
    </dependency>
  </dependencies>

    <build>
        <plugins>
            <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        </plugins>
    </build>

</project>

這種行為的原因是什么,我該如何解決?

編輯更多信息:

<scope>provided</scope>javax.servlet-api似乎修復了有關javax.servlet-api未在開始時加載的警告。 el-api問題仍然存在。

我檢查了 tomcat/lib 目錄,它已經包含el-api.jar ,這可能是它告訴我它不會加載我在 pom.xml 中列出的那個的原因。 問題是,添加<scope>provided</scope>也不能解決它。 無論我做什么,它仍然抱怨給我同樣的java.lang.NoClassDefFoundError: javax/el/ELManager錯誤。

解決方案

除了上面編輯中關於javax.servlet-api的部分之外, el-api javax.servlet-api的問題是我正在運行帶有 2.2 版中提供的el-api jar 的 Tomcat 7。 缺失的類是在 el-api 3.0 中引入的。 在 Tomcat 8(使用 el-api 3.0 jar)中運行相同的 webapp 可以正常工作。

您錯過了javax.el-api作為依賴項。 添加:

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

到你的 pom.xml

Hibernate Validator 6.x -> Bean Validation 2.0 (JSR 380) -> EL3.0

Hibernate Validator 5.x -> Bean Validation 1.1 (JSR 349) -> EL2.2

Bean 驗證 1.0 (JSR 303) ->(我不確定)

所以,它也會影響其他版本(tomcat、jdk、jsp、servlet)

比如tomcat7,如果要使用Hibernate Validator,應該使用Hibernate Validator 5.x、el 2.2(以及servlet 3.0、jsp 2.2和jdk 6+)

將 hibernate-validator 降級到版本 5,它可以在 Tomcat 7 上正常工作。在我的情況下,我將下一個依賴項添加到我的 pom:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.4.3.Final</version>
</dependency>

或者您可以將更新的 el-api.jat 添加到 tomcat lib 文件夾。

請參考Hibernate 驗證“無法初始化 javax.el.E​​xpressionFactory”錯誤

使用

<dependency>
   <groupId>org.glassfish</groupId>
   <artifactId>javax.el</artifactId>
   <version>3.0.1-b08</version>
</dependency>

我使用的是 Tomcat 7.0.9,由於我公司的官僚作風,無法更改為任何更新的版本。 將 EL 作為依賴項導入也沒有解決它。

在 Tomcat 的根文件夾 -> lib 我用新的 3.0(來自本地.m2\\repository\\javax\\el\\javax.el-api\\3.0.0 )替換了舊的 el-api(它的 2.2 版本)。 然后,正確隔離Tomcat的依賴關系(如圖所示這里)使我的WAR被正確部署在Tomcat的7.0.9

為那些擁有 Tomcat 7 並嘗試應用所選答案的人添加我的答案。

如果添加依賴項對您沒有幫助並且您繼續獲得

java.lang.NoClassDefFoundError: javax/el/ELManager

那是因為 Tomcat 7 不允許您使用javax.*包中的對象加載更現代的 jar。 它將打印到日志:

jakarta.el-3.0.3.jar - jar 未加載。 請參閱 Servlet 規范 3.0,第 10.7.2 節。 違規類:javax/el/Expression.class

解決方案是升級 Tomcat 或將 hibernate-validator 降級到最新的 5.x 版本。 另一個(從我的 POV 中不太喜歡)選項是嘗試替換 tomcat7/lib 文件夾中的 jar。

就我而言,注釋掉了這種依賴關系,

<!-- <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>6.0.8.Final</version>
    </dependency> -->

並添加

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

這解決了我的問題

請嘗試以下操作:

  • 正如其他人提到的,javax.eljavax.el-api添加到 pom.xml
  • 如果你有不同的類加載器——就像使用 OSGi 時的情況一樣——你需要臨時將上下文設置為保存實現的上下文。 用以下內容結束您的通話:

     ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader(); try { Class<?> currentClass = this.getClass(); // or any class that is in a bundle with the dependency Thread.currentThread().setContextClassLoader(currentClass.getClassLoader()); // execute library call } finally { Thread.currentThread().setContextClassLoader(originalClassLoader); // back to original context }
  • 向 META-INF/services/ 添加服務

  • 向 $java.home/lib/el.properties 添加屬性
  • 使用帶有 factoryId 的系統屬性

如果庫實例化ExpressionFactory經> ELManager.newInstance(..) > FactoryFinder.find(..)它有幾個策略,以找到一個實現。 調用是這樣硬編碼的:

public static ExpressionFactory newInstance(Properties properties) {
    return (ExpressionFactory) FactoryFinder.find(
        "javax.el.ExpressionFactory", "com.sun.el.ExpressionFactoryImpl", properties);
}

有關更多信息,請參閱javax.el.FactoryFinder.find(..)源代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM