我正在尝试通过创建一个从Weblogic 9.2的ApplicationLifecycleListener实现的侦听器类来为我的应用程序初始化log4j-1.2.8。当我部署应用程序时,我遇到以下例外情况:
java.lang.NoClassDefFoundError: org/apache/log4j/spi/RepositorySelector
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at weblogic.utils.classloaders.GenericClassLoader.defineClass(GenericClassLoader.java:338)
at weblogic.utils.classloaders.GenericClassLoader.findLocalClass(GenericClassLoader.java:291)
at weblogic.utils.classloaders.GenericClassLoader.findClass(GenericClassLoader.java:259)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:158)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at myApp.LoggerStartupService.preStart(LoggerStartupService.java:40)
at weblogic.application.internal.flow.BaseLifecycleFlow$PreStartAction.run(BaseLifecycleFlow.java:187)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
at weblogic.application.internal.flow.BaseLifecycleFlow$BaseAction.invoke(BaseLifecycleFlow.java:95)
at weblogic.application.internal.flow.BaseLifecycleFlow.preStart(BaseLifecycleFlow.java:53)
at weblogic.application.internal.flow.HeadLifecycleFlow.prepare(HeadLifecycleFlow.java:199)
at weblogic.application.internal.BaseDeployment$1.next(BaseDeployment.java:615)
at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:26)
at weblogic.application.internal.BaseDeployment.prepare(BaseDeployment.java:191)
at weblogic.application.internal.DeploymentStateChecker.prepare(DeploymentStateChecker.java:147)
at weblogic.deploy.internal.targetserver.AppContainerInvoker.prepare(AppContainerInvoker.java:61)
at weblogic.deploy.internal.targetserver.operations.ActivateOperation.createAndPrepareContainer(ActivateOperation.java:189)
at weblogic.deploy.internal.targetserver.operations.ActivateOperation.doPrepare(ActivateOperation.java:87)
at weblogic.deploy.internal.targetserver.operations.AbstractOperation.prepare(AbstractOperation.java:217)
at weblogic.deploy.internal.targetserver.DeploymentManager.handleDeploymentPrepare(DeploymentManager.java:718)
at weblogic.deploy.internal.targetserver.DeploymentManager.prepareDeploymentList(DeploymentManager.java:1185)
at weblogic.deploy.internal.targetserver.DeploymentManager.handlePrepare(DeploymentManager.java:247)
at weblogic.deploy.internal.targetserver.DeploymentServiceDispatcher.prepare(DeploymentServiceDispatcher.java:157)
at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer.doPrepareCallback(DeploymentReceiverCallbackDeliverer.java:157)
at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer.access$000(DeploymentReceiverCallbackDeliverer.java:12)
at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer$1.run(DeploymentReceiverCallbackDeliverer.java:45)
at weblogic.work.ServerWorkManagerImpl$WorkAdapterImpl.run(ServerWorkManagerImpl.java:518)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:181)
其中myApp.LoggerStartupService
是从ApplicationLifecycleListener
实施的类。
我检查了我的脚本中的类路径及其设置,以适应log4j所需的所有依赖项。 Appenders& log4j.xml中也有类别。看起来我错过了什么。关于问题可能是什么想法?
答案 0 :(得分:4)
java.lang.NoClassDefFoundError: org/apache/log4j/spi/RepositorySelector
这意味着在运行期间类路径中缺少所提到的消息中的类(虽然它在所讨论的调用类的编译期间可用,但这与ClassNotFoundException
不同)。
由于Log4j 本身使用它,因此Log4j JAR文件中缺少它。 RepositorySelector
javadoc向我们了解它是在Log4j 1.2中引入的。这意味着在类路径中与另一个和版本较旧的Log4j JAR文件发生冲突,该文件在类加载中优先。它可能隐藏在Weblogic的一个默认类路径中。我不做Weblogic,但正如其他人暗示的那样,如果Weblogic支持,你也可以尝试来改变类加载顺序。查阅其文档。
答案 1 :(得分:1)
其中myApp.LoggerStartupService是从ApplicationLifecycleListener实现的类。
好的,所以你实现了一个启动类。
我检查了我的脚本中的类路径及其设置,以适应log4j所需的所有依赖项。 Appenders& log4j.xml中也有类别。
您是如何设置该类路径的?你是如何打包你的创业课程的?你把它放在哪里?此外,log4j.jar
在哪里,您使用哪一个?您的启动类(及其依赖项)必须添加到服务器CLASSPATH
。这是你做的吗?有关如何执行此操作的详细信息,请参阅官方文档中的Add startup and shutdown classes to the classpath。
我想确认这些要点(但最终的答案是你应该在你的启动类的jar中使用MANIFEST.MF来引用第三方库)。
答案 2 :(得分:0)
对于我的情况,我使用log4j 2.x并且找不到org / apache / log4j / spi / RepositorySelector,因为版本2.x中没有这样的API,要使用它,需要添加log4j-1.2的依赖项-api
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-1.2-api</artifactId>
<version>2.5</version>
</dependency>
后
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.5</version>
</dependency>