web-dev-qa-db-fra.com

Causé par: Java.lang.NoClassDefFoundError: org/Apache/log4j/Logger

J'ai un problème intéressant dans lequel la classe org.Apache.log4j.Logger n'est pas trouvée au moment de l'exécution. J'essaie d'obtenir l'autorisation et c'est là que ça échoue:

OAuthAuthorizer oauthAuthorizer = new OAuthAuthorizer(OAUTH_CONSUMER_KEY, OAUTH_CONSUMER_SECRET, SAML_PROVIDER_ID, userId);

J'utilise JDeveloper 11.1.1.6. Voici ce que je sais:

  1. J'ai regardé dans mon répertoire UI.war/WEB-INF/lib et j'y trouve le log4j-1.2.17.jar.

  2. La classe qui s'en plaint est org.opensaml.xml.XMLConfigurator

    Caused by: Java.lang.NoClassDefFoundError: org/Apache/log4j/Logger
        at org.opensaml.xml.XMLConfigurator.<clinit>(XMLConfigurator.Java:60)
        at org.opensaml.DefaultBootstrap.initializeXMLTooling(DefaultBootstrap.Java:195)
        at org.opensaml.DefaultBootstrap.bootstrap(DefaultBootstrap.Java:91)
        at com.intuit.ipp.aggcat.util.SAML2AssertionGenerator.getSAMLBuilder(SAML2AssertionGenerator.Java:156)
        at com.intuit.ipp.aggcat.util.SAML2AssertionGenerator.createSubject(SAML2AssertionGenerator.Java:187)
        at com.intuit.ipp.aggcat.util.SAML2AssertionGenerator.buildAssertion(SAML2AssertionGenerator.Java:114)
        at com.intuit.ipp.aggcat.util.SAML2AssertionGenerator.generateSignedAssertion(SAML2AssertionGenerator.Java:83)
        at com.intuit.ipp.aggcat.util.SamlUtil.createSignedSAMLPayload(SamlUtil.Java:156)
        at com.intuit.ipp.aggcat.util.OAuthUtil.getOAuthTokens(OAuthUtil.Java:60)
        at com.intuit.ipp.aggcat.core.OAuthAuthorizer.<init>(OAuthAuthorizer.Java:85)
        at com.incomemax.view.intuit.WebUtil.getAggCatService(WebUtil.Java:91)
    
    Caused by: Java.lang.ClassNotFoundException: org.Apache.log4j.Logger
        at Java.net.URLClassLoader$1.run(URLClassLoader.Java:202)
        at Java.security.AccessController.doPrivileged(Native Method)
        at Java.net.URLClassLoader.findClass(URLClassLoader.Java:190)
        at Java.lang.ClassLoader.loadClass(ClassLoader.Java:305)
        at Sun.misc.Launcher$AppClassLoader.loadClass(Launcher.Java:301)
        at Java.lang.ClassLoader.loadClass(ClassLoader.Java:246)
        ... 64 more
    
  3. J'ai déconformé XMLConfigurator et, curieusement, il n'importe pas org.Apache.log4j.Logger. Il utilise org.slf4j.Logger qui se trouve également dans mon répertoire jars (slf4j-api-1.7.5.jar). Il est également intéressant de noter que la ligne 60 (voir trace de la pile) est une ligne vide dans ma décompile.

  4. Bien sûr, si j'ajoute Logger.xxxxx lors de la conception, les choses se passent bien.

  5. J'utilise le code/jars directement à partir de l'exemple de code Java, mais importés dans mon application existante.

J'ai parcouru le Web à la recherche de réponses et je crois avoir vérifié tous les domaines auxquels je peux penser. J'ai aussi référencé cette très bonne page: http://myarch.com/classnotfound/

L'autorisation étant l'étape 1 dans l'utilisation de l'API de développeur Intuit, je suis un peu coincé.

Ajout de la sortie de la suggestion @jhadesdev:

Toutes les versions de log4j logger:

  • Zip: C: /Users/Chris/AppData/Roaming/JDeveloper/system11.1.1.6.38.61.92/DefaultDomain/servers/DefaultServer/tmp/_WL_user/j2ee-app/lt5l71/war/WEB-INF/lib/log4j&lang=fr .17.jar! /Org/Apache/log4j/Logger.class

Toutes les versions de log4j visibles à partir du chargeur de classes de la classe OAuthAuthorizer:

  • Zip: C: /Users/Chris/AppData/Roaming/JDeveloper/system11.1.1.6.38.61.92/DefaultDomain/servers/DefaultServer/tmp/_WL_user/j2ee-app/lt5l71/war/WEB-INF/lib/log4j&lang=fr .17.jar! /Org/Apache/log4j/Logger.class

Toutes les versions de XMLConfigurator:

  • jar: fichier:/C: /Oracle/Middleware11116/modules/com.bea.core.bea.opensaml2_1.0.0.0_6-0-0.jar! /org/opensaml/xml/XMLConfigurator.class

  • Zip: C: /Users/Chris/AppData/Roaming/JDeveloper/system11.1.1.6.38.61.92/DefaultDomain/servers/DefaultServer/tmp/_WL_user/j2ee-app/lt5l71/war/WEB-INF/lib/ipp-Java -aggcat-v1-devkit-1.0.2.jar! /org/opensaml/xml/XMLConfigurator.class

  • Zip: C: /Users/Chris/AppData/Roaming/JDeveloper/system11.1.1.6.38.61.92/DefaultDomain/servers/DefaultServer/tmp/_WL_user/j2ee-app/lt5l71/war/WEB-INF/lib/xmltooling .1.jar! /Org/opensaml/xml/XMLConfigurator.class

Toutes les versions de XMLConfigurator visibles à partir du chargeur de classes de la classe OAuthAuthorizer:

  • jar: fichier:/C: /Oracle/Middleware11116/modules/com.bea.core.bea.opensaml2_1.0.0.0_6-0-0.jar! /org/opensaml/xml/XMLConfigurator.class

  • Zip: C: /Users/Chris/AppData/Roaming/JDeveloper/system11.1.1.6.38.61.92/DefaultDomain/servers/DefaultServer/tmp/_WL_user/j2ee-app/lt5l71/war/WEB-INF/lib/ipp-Java -aggcat-v1-devkit-1.0.2.jar! /org/opensaml/xml/XMLConfigurator.class

  • Zip: C: /Users/Chris/AppData/Roaming/JDeveloper/system11.1.1.6.38.61.92/DefaultDomain/servers/DefaultServer/tmp/_WL_user/j2ee-app/lt5l71/war/WEB-INF/lib/xmltooling .1.jar! /Org/opensaml/xml/XMLConfigurator.class

Je travaille toujours sur l'interprétation des résultats.

35
lovebeer84

Avec les suggestions @jhadesdev et les explications des autres, j'ai trouvé le problème ici.

Après avoir ajouté le code pour voir ce qui était visible pour les différents chargeurs de classe, j'ai trouvé ceci:

All versions of log4j Logger: 
  Zip:<snip>war/WEB-INF/lib/log4j-1.2.17.jar!/org/Apache/log4j/Logger.class

All versions of log4j visible from the classloader of the OAuthAuthorizer class: 
  Zip:<snip>war/WEB-INF/lib/log4j-1.2.17.jar!/org/Apache/log4j/Logger.class

All versions of XMLConfigurator: 
  jar:<snip>com.bea.core.bea.opensaml2_1.0.0.0_6-1-0-0.jar!/org/opensaml/xml/XMLConfigurator.class
  Zip:<snip>war/WEB-INF/lib/ipp-Java-aggcat-v1-devkit-1.0.2.jar!/org/opensaml/xml/XMLConfigurator.class
  Zip:<snip>war/WEB-INF/lib/xmltooling-1.3.1.jar!/org/opensaml/xml/XMLConfigurator.class

All versions of XMLConfigurator visible from the classloader of the OAuthAuthorizer class: 
  jar:<snip>com.bea.core.bea.opensaml2_1.0.0.0_6-1-0-0.jar!/org/opensaml/xml/XMLConfigurator.class
  Zip:<snip>war/WEB-INF/lib/ipp-Java-aggcat-v1-devkit-1.0.2.jar!/org/opensaml/xml/XMLConfigurator.class
  Zip:<snip>war/WEB-INF/lib/xmltooling-1.3.1.jar!/org/opensaml/xml/XMLConfigurator.class

J'ai remarqué qu'une autre version de XMLConfigurator était peut-être sélectionnée .. J'ai décompilé cette classe et l'ai trouvée à la ligne 60 (où l'erreur était dans la trace de pile d'origine) private static final Logger log = Logger.getLogger(XMLConfigurator.class); et cette classe importait depuis org.Apache.log4j.Logger!

C'est donc cette classe qui était chargée et utilisée. Mon correctif consistait à renommer le fichier JAR contenant ce fichier, car je ne trouve pas où je le charge explicitement ou indirectement. Ce qui peut poser un problème lorsque je déploie réellement.

Merci pour toute l'aide et la leçon indispensable sur le chargement de la classe.

3
lovebeer84

Pendant l'exécution, votre application ne peut pas trouver le fichier jar.

Tiré de cette réponse de Jared :

Il est important de garder deux exceptions différentes dans notre tête dans ce cas:

  1. Java.lang.ClassNotFoundException Ceci est un Exception, il indique que le la classe n'a pas été trouvée sur le classpath. Cela indique que nous étions essayer de charger la définition de classe, et la classe n'existait pas sur le classpath.

  2. Java.lang.NoClassDefFoundError Ceci est Error, cela indique que la machine virtuelle Java regardé dans sa structure de données de définition de classe interne pour le définition d’une classe et ne l’a pas trouvée. Ceci est différent de en disant qu'il ne pourrait pas être chargé à partir du classpath. Habituellement ceci indique que nous avons précédemment essayé de charger une classe à partir du fichier classpath, mais il a échoué pour une raison quelconque - maintenant, nous essayons à nouveau, mais nous n'allons même pas essayer de le charger, car nous avons échoué le charger plus tôt. L'échec précédent pourrait être un ClassNotFoundException ou une exception ExceptionInInitializerError (indiquant Une erreur dans le bloc d'initialisation statique) ou un nombre quelconque d'autres problèmes. Le fait est que NoClassDefFoundError n'est pas nécessairement un problème de classpath.

pour les similitudes et les différences

27
Premraj

Vous pouvez utiliser la dépendance maven suivante dans votre fichier pom. Sinon, vous pouvez télécharger les deux fichiers JAR suivants à partir de net et les ajouter à votre chemin de génération. 

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.6.4</version>
</dependency>

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.6.4</version>
</dependency>

Ceci est copié de mon projet de travail. Tout d’abord, assurez-vous que cela fonctionne dans votre projet. Vous pouvez ensuite modifier les versions pour utiliser tout autre fichier jar compatible (versions). 

Pour AggCat, vous pouvez vous référer au fichier POM de l'exemple d'application Java.

https://github.com/IntuitDeveloperRelations/IPP_Sample_Code/blob/master/CustomerAccountData/Java/AggCatSampleApplication/pom.xml

Merci

9
Manas Mukherjee

Vérifier dans l'assemblage de déploiement, 

J'ai la même erreur, lorsque je génère le fichier war avec la méthode "maven clean install" et que je le déploie manuellement, cela fonctionne bien, mais lorsque j'utilise l'environnement d'exécution (Eclipse), les problèmes surviennent.

La solution pour moi (pour Eclipse IDE), allez à: "propriétés du projet" -> "Assemblage de déploiement" -> "Ajouter" -> "le jar dont vous avez besoin", dans mon cas Java "entrées du chemin de construction" . Peut peut-être aider un peu!

5
perezmirabile

Sur la base de la pile, une classe intuitive com.intuit.ipp.aggcat.util.SAML2AssertionGenerator a besoin d’un jar saml sur le chemin de classe.

La classe org.opensaml.xml.XMLConfigurator de la classe saml a besoin de son tour log4j, qui se trouve dans le fichier WAR, mais ne le trouve pas.

Une explication à cela est que la classe XMLConfigurator qui a besoin de log4j a été trouvée non pas dans le fichier WAR, mais sur un chargeur de classe en aval. un pot de saml pourrait-il manquer à la guerre?

La classe XMLConfigurator qui a besoin de log4j ne peut pas la trouver au niveau du chargeur de classes qui l'a chargé, et la version de log4j du fichier WAR n'est pas visible sur ce chargeur de classes particulier.

Pour résoudre ce problème, vous pouvez ajouter ceci avant l'appel oauth:

System.out.println("all versions of log4j Logger: " + getClass().getClassLoader().getResources("org/Apache/log4j/Logger.class") );

System.out.println("all versions of XMLConfigurator: " + getClass().getClassLoader().getResources("org/opensaml/xml/XMLConfigurator.class") );

System.out.println("all versions of XMLConfigurator visible from the classloader of the OAuthAuthorizer class: " + OAuthAuthorizer.class.getClassLoader().getResources("org/opensaml/xml/XMLConfigurator.class") );

System.out.println("all versions of log4j visible from the classloader of the OAuthAuthorizer class: " + OAuthAuthorizer.class.getClassloader().getResources("org/Apache/log4j/Logger.class") );

De même, si vous utilisez Java 7, consultez jHades , c’est un outil que j’ai conçu pour vous aider à résoudre ce type de problèmes. 

Pour voir ce qui se passe, pourriez-vous publier les résultats des requêtes de classpath ci-dessus, pour quel conteneur cela se produit-il, Tomcat, jetée? Il serait préférable de mettre le stacktrace complet avec toutes les causes de dans Pastebin, juste au cas où.

4
Angular University

Avec le même problème, weblogic utilisait bêtement sa propre implémentation opensaml. Pour le résoudre, vous devez lui dire de charger les classes de WEB-INF/lib pour ce paquet en weblogic.xml:

    <prefer-application-packages>
        <package-name>org.opensaml.*</package-name>
    </prefer-application-packages>

peut-être que <prefer-web-inf-classes>true</prefer-web-inf-classes> fonctionnerait aussi.

2
Denis Tulskiy

Java.lang.ClassNotFoundException indique que la classe n’est pas trouvée dans le chemin de la classe . Il est possible que la version de log4j ne soit pas compatible . Recherchez une version différente de log4j. 

1
Dharmraj

J'ai eu le même problème, pour moi cela a résolu le problème:
clic droit sur le projet -> maven -> projet de mise à jour

 maven -> update project

0
user648026