代码之家  ›  专栏  ›  技术社区  ›  Gaurav Saini

无法初始化log4j

  •  3
  • Gaurav Saini  · 技术社区  · 14 年前

    我试图通过创建一个从WebLogic9.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中也有appenders&categories。看来我错过了什么。有什么问题吗?

    3 回复  |  直到 8 年前
        1
  •  4
  •   BalusC    14 年前
    java.lang.NoClassDefFoundError: org/apache/log4j/spi/RepositorySelector
    

    这意味着在运行时,类路径中缺少所提到的消息中的类(尽管在所讨论的调用类的编译期间它是可用的),但这与 ClassNotFoundException )

    因为这是log4j使用的 它本身 因此,它在log4j jar文件中丢失。这个 RepositorySelector javadoc 告诉我们,它是在log4j 1.2中介绍的。这意味着在类路径中与另一个和旧版本的log4j jar文件发生冲突,后者在类加载中具有优先权。它可能隐藏在WebLogic的一个默认类路径中。我不做WebLogic,但正如其他人暗示的那样,你也可以 尝试 如果WebLogic支持,则更改类加载顺序。查阅文件。

        2
  •  1
  •   Pascal Thivent    14 年前

    其中myapp.loggerstartupservice是从ApplicationLifecycleListener实现的类。

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

    我检查了脚本中的类路径和它的集合,以确定log4j所需的所有依赖项。log4j.xml中也有appenders&categories。

    你是如何设置类路径的?你是如何包装你的启动类的?你把它放在哪里?还有,哪里是 log4j.jar ,你用哪一个?您的启动类(及其依赖项) 必须添加到服务器 CLASSPATH . 这就是你做的吗?参照 Add startup and shutdown classes to the classpath 在官方文件中详细介绍了如何做到这一点。

    我想确认一下这些点(但最终的答案是,您应该在启动类的JAR中使用manifest.mf来引用第三方库)。

        3
  •  0
  •   andrewchan2022    8 年前

    在我的例子中,我使用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>
    
    推荐文章