意外异常:java.lang.NoClassDefFoundError: org/apache/log4j/LogManager

2022-09-03 14:04:58

我正在开发一个GWT应用程序。它使用 RPC 从内部系统收集信息。它通过使用库罐子来做到这一点,让我们称之为alpha.jar。我们在许多应用中都使用了这个罐子,所以它工作正常,顺便说一句,它是用ANT构建的,在日食之外。

alpha.jar中的一些类引用LOG4J2以及许多其他外部jar,因此当我们运行应用程序时,我们会将类路径传递给所有这些类,并且一切正常。请注意,这不是一个简单的初学者问题。alpha.jar正在按预期工作,包括对Log4J的调用。

问题:

在Eclipse中,我有这个GWT应用程序项目,还有Alpha.jar项目(当然还有源代码)。服务器部分需要初始化 alpha 对象并与 alpha 系统通信。

在 GWT 中通过向 Alpha 项目添加构建路径引用来执行此操作时,我的 GWT 应用运行良好。

当我而不是项目引用包含(在war/WEB-INF/lib中)alpha.jar并运行应用程序时,当我第一次从alpha.jar实例化类时,我在标题中得到了错误。

alpha.jar的构建方式没有特点,所以基本上它应该与eclipse中的项目相同,对吧?

请注意以下几点:

*) alpha.jar 的依赖 jar 也处于 war/WEB-INF/lib 中。log4j2-core,log4j-api以及一堆其他的(例如apache常见)

*)如果我删除alpha.jar(以及调用它的代码),而只是添加名为LOG4J2的代码,则该代码也可以正常工作!

为什么我在使用JAR时遇到这个奇怪的错误?还要注意NoClassDefFoundError,它不是更常见的ClassNotFoundException。请参阅NoClassDefFoundError和ClassNotFoundException之间的原因和区别是什么?

如果您需要更多信息,请告诉我。


答案 1

org.apache.log4j.LogManager是 log4j 1.2(不是 log4j2)中的一个类。

因此,必须引用其中一个 Web 应用 jar。罪魁祸首应该在堆栈跟踪中可见。

根据您的具体情况,您可能只想向Web应用程序添加log4j 1.2 jar,因为这两个版本完全独立。


答案 2

如果您使用log4j 2,请不要忘记将log4j2.xml而不是log4j命名.xml


推荐