2017-08-23 117 views
1

我正在使用Spring Tool Suite處理Spring中的webapp。如果我使用IDE在所提供的Pivotal tc服務器上構建和部署應用程序,那麼它工作得很好。但是,如果我做一個手動「MVN清潔套裝」建設,並試圖將其部署到一個獨立的Tomcat服務器(使用最新的Tomcat 7),它拋出以下異常:java.lang.NoClassDefFoundError:javax/el/ELManager

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錯誤。

SOLUTION

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

+0

這是否幫助? https://stackoverflow.com/questions/15601469/jar-not-loaded-see-servlet-spec-2-3-section-9-7-2-offending-class-javax-serv – GhostCat

+0

@GhostCat解決了這個問題加載'javax.servlet-api-xyzjar',即將'提供的'添加到'javax.servlet-api'。然而,我仍然在與'el-api'問題作鬥爭。在下面的答案下的評論更多信息。 –

回答

5

您錯過了javax.el-api作爲依賴關係。地址:

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

到你的pom.xml

+0

我以前試過。事情是 - 我仍然得到這個錯誤,再加上tomcat告訴我,它在開始部署應用程序時無法加載'el-api' jar。當我查看tomcat/lib目錄時,它已經包含了'el-api.jar',這可能是爲什麼它告訴我它不會加載我在pom.xml中列出的那個。事情是,增加'提供'不修復它。無論我做什麼,它仍然抱怨給我相同的'java.lang.NoClassDefFoundError:javax/el/ELManager'錯誤。 –

+0

@JacekŚlimok你使用哪個版本的javax.el-api? – Jens

+0

至於在tomcat/lib中提供的版本 - jar文件名沒有指定它(它是'el-api.jar')。根據MANIFEST.MF裏面的版本2.2:https://pastebin.com/sHpZKxrF –