web-dev-qa-db-ja.com

java.lang.NoClassDefFoundError:javax / el / ELManager

Spring Tool Suiteを使用して、Springでwebappを作成しています。 IDEを使用して、提供されたPivotal tcサーバーにアプリケーションをビルドおよびデプロイすると、正常に機能します。ただし、手動で「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

さらに詳しく調べてみると、jarをロードしていないことについて上記の数行上に文句を言っています。

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>

この動作の理由は何ですか?どのように解決できますか?

EDIT詳細情報:

<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の問題は、バージョン2.2でel-api jarを提供するTomcat 7を実行していたことです。欠落しているクラスはel-api 3.0で導入されました。 Tomcat 8(el-api 3.0 jarを使用)で同じwebappを実行すると正常に動作します。

17
Jacek Ślimok

依存関係としてjavax.el-apiを見逃しています。追加:

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

pom.xmlに

22
Jens

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フォルダーに追加できます。

2

Hibernate検証 "javax.el.E​​xpressionFactoryを初期化できません"エラー を参照してください。

つかいます

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

私の場合、この依存関係をコメントアウトし、

<!-- <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> 

これで問題が解決しました

1
Khan

私はTomcat 7.0.9を使用していますが、会社の官僚機構のために新しいものに変更できませんでした。 ELを依存関係としてインポートしても解決しませんでした。

Tomcatのルートフォルダー-> libで、古いel-api(2.2バージョン)を新しい3.0(ローカル.m2\repository\javax\el\javax.el-api\3.0.0から)に置き換えました。次に、Tomcatの依存関係を適切に分離し( here を参照)、Tomcat 7.0.9でWARを正しくデプロイしました

0
GabrielRado

以下を試してください:

  • javax.eljavax.el-apiを他のユーザーとしてpom.xmlに追加します mention
  • 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(..)のソースを参照してください

0
Terran

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 Validation 1.0(JSR 303)->(わかりません)

そのため、他のバージョンにも影響します(Tomcat、jdk、jsp、servlet)

tomcat7など、Hibernate Validatorを使用する場合は、Hibernate Validator 5.x、el 2.2(およびサーブレット3.0、jsp 2.2、jdk 6+)を使用する必要があります

0
CuriousRookie