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:
J'ai regardé dans mon répertoire UI.war/WEB-INF/lib et j'y trouve le log4j-1.2.17.jar.
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
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.
Bien sûr, si j'ajoute Logger.xxxxx lors de la conception, les choses se passent bien.
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:
Toutes les versions de log4j visibles à partir du chargeur de classes de la classe OAuthAuthorizer:
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.
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.
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:
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.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.
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.
Merci
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!
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ù.
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.
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.