3

我正在尝试通过创建从 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 所需的所有依赖项正确设置了它。附加程序和类别也存在于 log4j.xml 中。看起来我错过了什么。关于问题可能是什么的任何想法?

4

3 回答 3

4
java.lang.NoClassDefFoundError: org/apache/log4j/spi/RepositorySelector

这意味着消息中提到的类在运行时在类路径中丢失(虽然它在所讨论的调用类的编译时可用,但这就是与 的区别ClassNotFoundException)。

由于 Log4j本身使用了它,因此 Log4j JAR 文件中缺少它。RepositorySelector javadoc告诉我们它是在 Log4j 1.2 中引入的。这意味着与类路径中另一个较旧版本的 Log4j JAR 文件发生冲突,该文件在类加载中具有优先权。它可能隐藏在 Weblogic 的默认类路径之一中。我不做 Weblogic,但正如其他人所暗示的,如果 Weblogic 支持,您也可以尝试更改类加载顺序。查阅其文档。

于 2010-01-20T00:42:41.857 回答
1

其中 myApp.LoggerStartupService 是从 ApplicationLifecycleListener 实现的类。

好的,所以你实现了一个启动类。

我检查了脚本中的类路径,并为 log4j 所需的所有依赖项正确设置了它。附加程序和类别也存在于 log4j.xml 中。

您是如何设置该类路径的?你是如何打包你的创业课程的,你把它放在哪里?另外,在哪里log4j.jar,你用的是哪一个?您的启动类(及其依赖项)必须添加到服务器CLASSPATH。这是你做的吗?有关如何执行此操作的详细信息,请参阅官方文档中的将启动和关闭类添加到类路径。

我想确认这些要点(但最终答案是您应该在启动类的 jar 中使用 MANIFEST.MF 来引用第三方库)。

于 2010-01-20T00:51:45.267 回答
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>
于 2016-05-06T15:46:37.820 回答