我正在开发 GWT 应用程序。它使用 RPC 从内部系统收集信息。它通过使用库 jar 来实现,我们称之为 alpha.jar。我们在许多应用程序中使用这个 jar,所以它工作正常,顺便说一句,它是用 ANT 构建的,在 eclipse 之外。
alpha.jar 中的一些类引用 LOG4J2 以及许多其他外部 jar,因此当我们运行应用程序时,我们将类路径传递给所有这些类,并且一切正常。请注意,这不是一个简单的初学者问题。alpha.jar 正在正常工作,包括对 Log4J 的调用。
问题:
在 Eclipse 中,我有这个 GWT 应用程序项目和 Alpha.jar 项目(当然还有源代码)。服务器部分需要设置 alpha 对象并与 alpha 系统通信。
通过向 Alpha 项目添加构建路径引用在 GWT 中执行此操作时,我的 GWT 应用程序运行良好。
当我而不是项目引用包含(在 war/WEB-INF/lib 中)alpha.jar 并运行应用程序时,我在第一次从 alpha.jar 实例化一个类时收到标题中的错误。
alpha.jar 的构建方式没有什么特别之处,所以基本上应该和eclipse中的项目是一样的吧?
请注意以下事项:
*) alpha.jar 的依赖 jars 也在 war/WEB-INF/lib 中。log4j2-core、log4j-api 以及其他一些(例如常见的 apache)
*) 如果我删除 alpha.jar(以及调用它的代码),而只是添加调用 LOG4J2 的代码,那么该代码也可以正常工作!
使用 JAR 时怎么会出现这个奇怪的错误?还要注意 NoClassDefFoundError,它不是更常见的 ClassNotFoundException。请参阅NoClassDefFoundError 和 ClassNotFoundException 之间的原因和区别是什么?
如果您需要更多信息,请告诉我。
org.apache.log4j.LogManager
是 log4j 1.2 中的一个类(不是 log4j2)。因此,您的 Web 应用程序 jar 之一必须引用它。罪魁祸首应该在堆栈跟踪中可见。
根据您的情况,您可能只想向 Web 应用程序添加一个 log4j 1.2 jar,因为这两个版本彼此完全独立。