引起者:java.lang.NoClassDefFoundError:org / apache / log4j / Logger

时间:2014-01-03 17:34:40

标签: java logging classpath classloader intuit-partner-platform

我遇到了一个有趣的问题,在运行时没有找到org.apache.log4j.Logger类。我正在尝试获得授权,这就是它失败的地方:

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

我正在使用JDeveloper 11.1.1.6。这就是我所知道的:

  1. 我查看了我的UI.war / WEB-INF / lib目录,我看到了log4j-1.2.17.jar。

  2. 抱怨它的类是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. 我解析了XMLConfigurator,奇怪的是它没有导入org.apache.log4j.Logger它使用org.slf4j.Logger,它也在我的jars目录中(slf4j-api-1.7.5.jar)。同样有趣的是第60行(参见堆栈跟踪)在我的反编译中是一个空行。

  4. 当然如果我在设计时添加Logger.xxxxx,它会发现它很好。

  5. 我直接从示例java代码中使用代码/ jar,但导入到我现有的应用程序中。

  6. 我一直在网上寻找答案,我相信我已经检查了所有我能想到的领域。我还引用了这个非常好的页面:http://myarch.com/classnotfound/

    鉴于授权是使用Intuit Developer API的第1步,我有点卡住了。

    从@jhadesdev建议添加输出:

    所有版本的log4j Logger:

    • 拉链: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

    所有版本的log4j都可以从OAuthAuthorizer类的类加载器中看到:

    • 拉链: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

    所有版本的XMLConfigurator:

    • 罐:文件:/ C:!/Oracle/Middleware11116/modules/com.bea.core.bea.opensaml2_1.0.0.0_6-1-0-0.jar /组织/ opensaml / XML / XMLConfigurator的.class

    • 拉链: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

    • 拉链: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

    从OAuthAuthorizer类的类加载器中可以看到所有版本的XMLConfigurator:

    • 罐:文件:/ C:!/Oracle/Middleware11116/modules/com.bea.core.bea.opensaml2_1.0.0.0_6-1-0-0.jar /组织/ opensaml / XML / XMLConfigurator的.class

    • 拉链: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

    • 拉链: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

    我还在努力解释结果。

8 个答案:

答案 0 :(得分:28)

在运行期间,您的应用程序无法找到jar。

取自this answerJared

  

重要的是要保持两个不同的例外   在这种情况下:

     
      
  1. java.lang.ClassNotFoundException 这是一个Exception,它表示   类路径上找不到类。这表明我们是   试图加载类定义,并且该类不存在   classpath。

  2.   
  3. java.lang.NoClassDefFoundError 这是Error,它表示JVM       查看了它的内部类定义数据结构       一个类的定义,但没有找到它。这不同于       说它无法从类路径加载。通常这个       表示我们之前尝试从中加载一个类       classpath,但由于某种原因它失败了 - 现在我们再次尝试,       但我们甚至都不会尝试加载它,因为我们失败了       先加载它。早期的失败可能是一个       ClassNotFoundException或ExceptionInInitializerError(表示       静态初始化块中的失败)或任何其他数量的失败       问题。关键是,NoClassDefFoundError不一定是       类路径问题。

  4.   

for similarities and differences

答案 1 :(得分:9)

您可以在pom文件中使用以下maven依赖项。否则,您可以从net下载以下两个jar并将其添加到构建路径中。

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

这是从我的工作项目中复制的。首先确保它在您的项目中正常工作。然后,您可以更改版本以使用任何其他(版本)兼容的jar。

对于AggCat,您可以参考示例Java应用程序的POM文件。

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

由于

答案 2 :(得分:7)

签入部署程序集,

我有同样的错误,当我使用“maven clean install”方式生成war文件并部署manualy时,它工作正常,但是当我使用运行时环境(eclipse)时会出现问题。

我的解决方案(对于eclipse IDE)转到:“proyect properties” - &gt; “部署程序集” - &gt; “添加” - &gt; “你需要的jar”,在我的例子中是java“build path entries”。 也许可以帮助痘痘!

答案 3 :(得分:4)

基于堆栈跟踪,intuit类com.intuit.ipp.aggcat.util.SAML2AssertionGenerator需要类路径上的saml jar。

一个saml类org.opensaml.xml.XMLConfigurator需要它的log4j,它在WAR内部但找不到它。

对此的一个解释是,需要log4j的类XMLConfigurator不在WAR内部,而是在下游类加载器中。 WAR可能会丢失一个saml jar吗?

需要log4j的类XMLConfigurator无法在加载它的类加载器级别找到它,并且WAR上的log4j版本在该特定类加载器上不可见。

为了解决这个问题,一种方法是在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") );

此外,如果您使用的是Java 7,请查看jHades,这是我帮助解决这些类型问题的工具。

为了看看发生了什么,你可以发布上面的类路径查询的结果,这个容器发生了什么,tomcat,jetty?为了以防万一,最好把完整的堆栈跟踪放在由pastebin引起的所有内容中。

答案 4 :(得分:3)

根据@jhadesdev的建议和其他人的解释,我在这里找到了问题。

添加代码以查看各种类加载器可见的内容后,我发现了这个:

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

我注意到另一个版本的XMLConfigurator可能会被拿起来。 我反编译了该类并在第60行(错误位于原始堆栈跟踪中)private static final Logger log = Logger.getLogger(XMLConfigurator.class);找到了该类,并且该类是从org.apache.log4j.Logger导入的!

所以正在加载和使用这个类。我的修复是重命名包含此文件的jar文件,因为我无法找到我明确或间接加载它的位置。实际部署时可能会出现问题。

感谢您提供有关课程加载的所有帮助和急需的课程。

答案 5 :(得分:3)

有同样的问题,它确实是由weblogic愚蠢地使用自己的opensaml实现引起的。要解决此问题,您必须告诉它在WEB-INF/lib中为此包加载weblogic.xml的类:

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

也许<prefer-web-inf-classes>true</prefer-web-inf-classes>也可以。

答案 6 :(得分:1)

java.lang.ClassNotFoundException表示在类路径中找不到类。 它可能是log4j的版本不兼容。 检查不同的log4j版本。

答案 7 :(得分:0)

我遇到了同样的问题,对我来说,这解决了这个问题:
右键单击项目-> maven->更新项目

maven -> update project