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

新手上路,请多包涵

我有一个有趣的问题,在运行时找不到 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

  1. 我反编译了 XMLConfigurator,奇怪的是它没有导入 org.apache.log4j.Logger 它使用 org.slf4j.Logger,它也在我的 jars 目录 (slf4j-api-1.7.5.jar) 中。同样有趣的是,第 60 行(参见堆栈跟踪)在我的反编译中是一个空行。

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

  3. 我直接使用示例 Java 代码中的代码/jars,但导入到我现有的应用程序中。

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

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

添加@jhadesdev 建议的输出:

所有版本的 log4j 记录器:

  • 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

从 OAuthAuthorizer 类的类加载器可见的所有 log4j 版本:

  • 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

XMLConfigurator 的所有版本:

  • jar:文件:/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

从 OAuthAuthorizer 类的类加载器可见的所有版本的 XMLConfigurator:

  • jar:文件:/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

我仍在努力解释结果。

原文由 lovebeer84 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

根据@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 文件,因为我找不到明确或间接加载它的位置。当我实际部署时,这可能会造成问题。

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

原文由 lovebeer84 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

取自 Jared这个答案

在这种情况下,将两个不同的例外情况牢记在心很重要:

  1. java.lang.ClassNotFoundException 这是一个 Exception ,它表示在类路径中找不到该类。这表明我们正在尝试加载类定义,而类路径中不存在该类。

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

对于相同点和不同点

原文由 Premraj 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题