Невозможно инициализировать log4j - PullRequest
3 голосов
/ 20 января 2010

Я пытаюсь инициализировать log4j-1.2.8 для моего приложения, создав класс слушателя, реализованный из ApplicationLifecycleListener Weblogic 9.2 При развертывании приложения я получаю следующие исключения:

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.

Я проверил classpath в своих скриптах и ​​правильно установил все зависимости, необходимые для log4j. Appenders & Categories также есть в log4j.xml. Похоже, я что-то упустил. Есть идеи, в чем может быть проблема?

Ответы [ 3 ]

4 голосов
/ 20 января 2010
java.lang.NoClassDefFoundError: org/apache/log4j/spi/RepositorySelector

Это означает, что указанный класс сообщения отсутствует в пути к классам во время выполнения (хотя он был доступен во время компиляции рассматриваемого класса, это разница с ClassNotFoundException).

Поскольку он используется самой Log4j , он отсутствует в файле JAR Log4j. RepositorySelector javadoc узнает, что он представлен в Log4j 1.2. Это будет означать, что в пути к классам есть конфликт с другим JAR-файлом Log4j с более старой версией, который получил приоритет при загрузке классов. Вероятно, он где-то спрятан в одном из стандартных путей к классам Weblogic. Я не занимаюсь Weblogic, но, как подсказывают другие, вы также можете попробовать изменить порядок загрузки классов, если он поддерживается Weblogic. Обратитесь к его документации.

1 голос
/ 20 января 2010

где myApp.LoggerStartupService - это класс, реализованный из ApplicationLifecycleListener.

Хорошо, поэтому вы реализовали класс запуска.

Я проверил путь к классам в моемскрипты и его набор правильно для всех зависимостей, необходимых для log4j.Appenders & Categories также есть в log4j.xml.

Как вы настроили этот classpath?Как вы упаковали свой класс стартапа и где вы его положили?Кроме того, где log4j.jar, какой вы используете?Ваш класс запуска (и его зависимости) должен быть добавлен на сервер CLASSPATH.Это то, что вы сделали?Подробнее о том, как это сделать, см. Добавление классов запуска и завершения к пути к классу в официальной документации.

Я хотел бы получить подтверждение этих пунктов (но окончательный ответ)является то, что вы должны использовать MANIFEST.MF в банке вашего класса запуска для ссылки на сторонние библиотеки).

0 голосов
/ 06 мая 2016

В моем случае я использую 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>
...