Pregunta Causado por: java.lang.NoClassDefFoundError: org / apache / log4j / Logger


Tengo un problema interesante en el que la clase org.apache.log4j.Logger no se encuentra durante el tiempo de ejecución. Estoy tratando de obtener autorización y ahí es donde está fallando:

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

Estoy usando JDeveloper 11.1.1.6. Esto es lo que sé:

  1. He buscado en mi directorio UI.war / WEB-INF / lib y veo log4j-1.2.17.jar allí.

  2. La clase que se queja es 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. Descompuesto XMLConfigurator y, curiosamente, no importa org.apache.log4j.Logger. Utiliza org.slf4j.Logger, que también está en mi directorio jars (slf4j-api-1.7.5.jar). También es interesante que la línea 60 (ver el seguimiento de la pila) es una línea en blanco en mi descompilación.

  4. Por supuesto, si agrego Logger.xxxxx durante el tiempo de diseño, lo encuentra muy bien.

  5. Estoy usando el código / jar directamente desde el código de Java de ejemplo, pero importado a mi aplicación existente.

He estado buscando por la web en busca de respuestas y creo que he verificado todas las áreas en las que puedo pensar. También hice referencia a esta muy buena página: http://myarch.com/classnotfound/

Dada la autorización es el paso 1 en el uso de la API de desarrollo Intuit, estoy un poco atascado.

Agregar salida de @jhadesdev sugerencia:

Todas las versiones 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-1.2 .17.jar! /Org/apache/log4j/Logger.class

Todas las versiones de log4j visibles desde el cargador de clases de la clase 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-1.2 .17.jar! /Org/apache/log4j/Logger.class

Todas las versiones de XMLConfigurator:

  • jar: file: / C: /Oracle/Middleware11116/modules/com.bea.core.bea.opensaml2_1.0.0.0_6-1-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.3 .1.jar! /Org/opensaml/xml/XMLConfigurator.class

Todas las versiones de XMLConfigurator visibles desde el cargador de clases de la clase OAuthAuthorizer:

  • jar: file: / C: /Oracle/Middleware11116/modules/com.bea.core.bea.opensaml2_1.0.0.0_6-1-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.3 .1.jar! /Org/opensaml/xml/XMLConfigurator.class

Todavía estoy trabajando en la interpretación de los resultados.


32
2018-01-03 17:34


origen


Respuestas:


Durante el tiempo de ejecución, su aplicación no puede encontrar el contenedor.

Tomado de esta respuesta por Jared:

Es importante mantener dos excepciones diferentes directamente en nuestra cabeza   en este caso:

  1. java.lang.ClassNotFoundException Esto es Exception, indica que el   la clase no se encontró en el classpath. Esto indica que estábamos   tratando de cargar la definición de clase, y la clase no existía en   la ruta de clases

  2. java.lang.NoClassDefFoundError Esto es Error, indica que la JVM       buscado en su estructura de datos de definición de clase interna para el       definición de una clase y no la encontró. Esto es diferente de       diciendo que no se pudo cargar desde classpath. Usualmente esto       indica que previamente intentamos cargar una clase del       classpath, pero falló por alguna razón, ahora lo intentamos de nuevo,       pero ni siquiera vamos a tratar de cargarlo, porque fallamos       cargando antes. La falla anterior podría ser una       ClassNotFoundException o un ExceptionInInitializerError (que indica       una falla en el bloque de inicialización estática) o cualquier cantidad de otros       problemas. El punto es que un NoClassDefFoundError no es necesariamente un       problema de clase

para similitudes y diferencias 


24
2018-01-03 17:45



Puede usar la siguiente dependencia maven en su archivo pom. De lo contrario, puede descargar los siguientes dos jar de la red y agregarlo a su ruta de compilación.

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

Esto se copia de mi proyecto de trabajo. Primero asegúrate de que esté funcionando en tu proyecto. Luego puede cambiar las versiones para usar cualquier otro (versiones) jar compatible.

Para AggCat, puede consultar el archivo POM de la aplicación java de muestra.

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

Gracias


5
2018-01-03 18:41



En función de stacktrace, una clase de intuición com.intuit.ipp.aggcat.util.SAML2AssertionGenerator necesita un jar de saml en el classpath.

Una clase saml org.opensaml.xml.XMLConfigurator necesita en su turno log4j, que está dentro del WAR pero no puede encontrarlo.

Una explicación para esto es que la clase XMLConfigurator que necesita log4j no se encontró dentro del WAR sino en un cargador de clases downstream. ¿Podría un tarro saml faltar en la GUERRA?

La clase XMLConfigurator que necesita log4j no puede encontrarlo en el nivel del cargador de clases que lo cargó, y la versión log4j en WAR no está visible en ese cargador de clases en particular.

Para solucionar esto, una forma es agregar esto antes de la llamada a 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") );

Además, si está utilizando Java 7, eche un vistazo a jHades, es una herramienta que hice para ayudar a solucionar este tipo de problemas.

Para ver qué está pasando, ¿podría publicar los resultados de las consultas de ruta de clases anteriores, para qué contenedor está sucediendo esto, tomcat, embarcadero? Sería mejor poner toda la pila de apilamiento con todas las causas por las que está en pastebin, por si acaso.


4
2018-01-03 19:22



Comprobar el montaje de despliegue,

Tengo el mismo error, cuando genero el archivo war con la instalación "maven clean install" y lo despliego a mano, funciona bien, pero cuando uso el entorno de tiempo de ejecución (eclipse) surgen los problemas.

La solución para mí (para eclipse IDE) vaya a: "propiedades de proyecto" -> "Implementación de implementación" -> "Agregar" -> "el contenedor que necesita", en mi caso java "entradas de compilación de ruta". Tal vez puede ayudar un poco!


4
2017-11-07 01:31



Con las sugerencias @jhadesdev y las explicaciones de otros, he encontrado el problema aquí.

Después de agregar el código para ver qué era visible para los diversos cargadores de clase, encontré esto:

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

Noté que posiblemente otra versión de XMLConfigurator fuera recogido. Descompilé esa clase y encontré esto en la línea 60 (donde el error estaba en el seguimiento de la pila original) private static final Logger log = Logger.getLogger(XMLConfigurator.class); y esa clase estaba importando de org.apache.log4j.Logger!

Entonces esta clase se estaba cargando y usando. Mi solución fue cambiar el nombre del archivo jar que contenía este archivo, ya que no puedo encontrar dónde lo carga explícita o indirectamente. Lo cual puede ser un problema cuando realmente despliegue.

Gracias por toda la ayuda y la muy necesaria lección sobre la carga de clases.


3
2018-01-03 21:48



Tenía el mismo problema, de hecho fue causado por weblogic estúpidamente usando su propia implementación de opensaml. Para resolverlo, debes decirle que cargue las clases desde WEB-INF/libpara este paquete en weblogic.xml:

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

tal vez <prefer-web-inf-classes>true</prefer-web-inf-classes> también funcionaría


2
2018-05-05 07:05



java.lang.ClassNotFoundException indica que la clase no se encuentra en la ruta de clase. podría ser la versión de log4j no es compatible. verifique la diferente versión de log4j.


1
2018-01-03 17:51