web-dev-qa-db-fra.com

java.lang.NoClassDefFoundError: Lorg/Apache/logging/log4j/Logger; mais l'artefact existe

J'utilise Tomcat pour déployer une application Web Java.

J'ai un très long stacktrace, en bref:

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
[...]

Maintenant, l'erreur est assez claire. Pour une raison quelconque, le bundle log4j n'est pas dans le classpath.

L'application est une application web maven, et le fichier pom.xml ressemble à ceci:

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

Si je vais dans les propriétés du projet, sous Bibliothèques-> Dépendances Maven, je vois ceci:

 enter image description here

Des bibliothèques ont été trouvées, téléchargées et elles sont dans le classpath.

J'ai également essayé d'ouvrir une classe Java dans mon projet et de déclarer

org.Apache.logging.log4j.Logger Logger;

Aucune erreur, l'interface Logger est trouvée.

Que se passe t-il ici? Pourquoi Tomcat ne parvient-il pas à démarrer même si les bibliothèques sont dans le chemin de classe?


Edit - c'est le fichier de configuration 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>
5
BackSlash

D'après la description que vous avez faite, je suppose que vous travaillez avec Eclipse.

Eh bien, vous feriez mieux d'aller à Project properties -> Deployment Assembly et de vous assurer que l'entrée maven dependencies est incluse.

J'ai souvent essayé de manquer cette configuration à chaque exécution de Maven -> Update Project.

8
Little Santi

Je travaille avec Eclipse et j'ai le même problème chaque fois que je modifie mon fichier pom.xml. Je ne sais pas pourquoi mais Eclipse supprime les dépendances Maven.

Solution: Cliquez avec le bouton projet , sélectionnez Propriétés , choisissez Assemblage de déploiement et vérifiez dans la colonne "Source" une ligne appelée "Dépendances Maven". Si ce n'est pas le cas, cliquez sur Ajouter ... , Entrées du chemin de construction Java et cliquez sur Dépendances Maven . Enfin Appliquer et fermer .

2
Ucha

Assurez-vous que les bibliothèques log4j ne sont pas déjà incluses dans le moteur d'exécution Tomcat (ni dans les répertoires approuvés), car cela pourrait générer un conflit au sujet de la stratégie de chargement de classes.

0
Little Santi