Сервер приложений Oracle развернул приложение, выдавшее ошибку - NoClassDefFoundError

Мы развернули наше веб-приложение, развернутое на сервере приложений Oracle, и столкнулись с этой ошибкой при запуске приложения.

 Caused by: java.lang.NoClassDefFoundError: org/apache/log4j/Category

 Caused by: org.apache.commons.logging.LogConfigurationException: No suitable Log constructor [Ljava.lang.Class;@12badee for org.apache.commons.logging.impl.Log4JLogger (Caused by java.lang.NoClassDefFoundError: org/apache/log4j/Category)

У нас есть log4j, встроенный в наше веб-приложение WEBINF/lib, и у нас есть общая библиотека для log4j в нашей библиотеке приложений. Поскольку эта общая библиотека используется многими приложениями, мы не можем ее удалить.

Я понимаю, что между этими двумя библиотеками log4j существует некоторый конфликт классов. Есть ли в любом случае, что мы можем исключить эту общую библиотеку и работать со встроенным log4j внутри веб-приложения? любая помощь в этом отношении высоко ценится.

2 ответа

Решение

Используйте элемент предпочитайте web-inf-classes в вашем weblogic.xml дескриптор приложения.
Согласно документации,

Установка этого элемента в True подрывает модель делегирования загрузчика классов, так что определения классов из веб-приложения загружаются в предпочтение определениям классов в загрузчиках классов более высокого уровня. Это позволяет веб-приложению использовать собственную версию стороннего класса, который также может быть частью WebLogic Server.

Это связанный вопрос, который также может вам помочь.

@Viccari Я искал то же самое, но для старого сервера приложений с OC4J. Решением было бы добавить WEB-INF/orion-web.xml со следующим содержимым

<orion-web-app ...>
  ...
  <web-app-class-loader search-local-classes-first="true"
   include-war-manifest-class-path="true" />
  ...
</orion-web-app>

Поскольку я развертывал приложение через консоль Enterprise Manager, вышеуказанное решение не сработало. Вы должны настроить загрузку классов в настройках развертывания, отключив опцию "Унаследовать импорт общей библиотеки родительского приложения".

Другой вариант - создать EAR с файлом META-INF/orion-application.xml со следующим содержимым и развернуть его.

<?xml version="1.0" encoding="UTF-8"?>
<orion-application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://xmlns.oracle.com/oracleas/schema/orion-application-10_0.xsd"
    deployment-version="10.1.3.4.0" default-data-source="jdbc/OracleDS"
    component-classification="external" schema-major-version="10"
    schema-minor-version="0">

    <imported-shared-libraries>
        <remove-inherited name="*"></remove-inherited>
    </imported-shared-libraries>

</orion-application>
Другие вопросы по тегам