Tomcatを使用してJava webapp。
要するに、非常に長いスタックトレースを取得します。
Grave: A child container failed during start
Java.util.concurrent.ExecutionException: org.Apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/new-webapp]]
[...]
Caused by: Java.lang.NoClassDefFoundError: Lorg/Apache/logging/log4j/Logger;
at Java.lang.Class.getDeclaredFields0(Native Method)
at Java.lang.Class.privateGetDeclaredFields(Class.Java:2509)
at Java.lang.Class.getDeclaredFields(Class.Java:1819)
at org.Apache.catalina.util.Introspection.getDeclaredFields(Introspection.Java:106)
at org.Apache.catalina.startup.WebAnnotationSet.loadFieldsAnnotation(WebAnnotationSet.Java:256)
at org.Apache.catalina.startup.WebAnnotationSet.loadApplicationFilterAnnotations(WebAnnotationSet.Java:105)
at org.Apache.catalina.startup.WebAnnotationSet.loadApplicationAnnotations(WebAnnotationSet.Java:64)
at org.Apache.catalina.startup.ContextConfig.applicationAnnotationsConfig(ContextConfig.Java:335)
at org.Apache.catalina.startup.ContextConfig.configureStart(ContextConfig.Java:782)
at org.Apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.Java:306)
at org.Apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.Java:95)
at org.Apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.Java:90)
at org.Apache.catalina.core.StandardContext.startInternal(StandardContext.Java:5150)
at org.Apache.catalina.util.LifecycleBase.start(LifecycleBase.Java:147)
... 6 more
Caused by: Java.lang.ClassNotFoundException: org.Apache.logging.log4j.Logger
at org.Apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.Java:1305)
at org.Apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.Java:1139)
... 20 more
[...]
これで、エラーはかなり明確になりました。何らかの理由で、log4jバンドルがクラスパスにありません。
アプリケーションはmaven webappであり、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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wb</groupId>
<artifactId>new-webapp</artifactId>
<packaging>war</packaging>
<version>0.0.1</version>
<properties>
<log4j.version>2.5</log4j.version>
</properties>
<dependencies>
[...]
<!-- Logging -->
<dependency>
<groupId>org.Apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.Apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.Apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>${log4j.version}</version>
</dependency>
</dependencies>
[...]
</project>
プロジェクトプロパティに移動すると、[ライブラリ]-> [Mavenの依存関係]に次のように表示されます。
ライブラリが見つかり、ダウンロードされ、クラスパスにあります。
また、プロジェクト内でJavaクラスを開いて宣言しようとしました
org.Apache.logging.log4j.Logger Logger;
エラーなし、Logger
インターフェースが見つかりました。
何が起きてる?ライブラリがクラスパスにあるのにTomcatが起動しないのはなぜですか?
編集-これはlog4j設定ファイルです:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
あなたが行った説明では、あなたはEclipseで作業していると思います。
そうですね、Project properties
-> Deployment Assembly
に移動して、maven dependencies
エントリが含まれていることを確認してください。
Maven
-> Update Project
を実行するたびにこの構成が失われることを何度も実験しました。
私はEclipseを使用していますが、pom.xmlを変更するたびに同じ問題が発生しました。理由はわかりませんが、EclipseがMavenの依存関係を削除します。
解決策:projectを厳密にクリックして、Propertiesを選択し、Deployment Assemblyを選択して、「ソース」列で「Maven Dependencies」という行を確認します。そこにない場合は、追加...、Javaビルドパスエントリをクリックして、Maven依存関係をクリックします。最後に適用して閉じる。
Log4jライブラリがTomcatランタイムに含まれていないことを確認します(承認されたディレクトリにも含まれていません)。これは、クラスローディングポリシーに関する競合を引き起こす可能性があるためです。