Подтвердить что ты не робот

Caused By: java.lang.NoClassDefFoundError: org/apache/log4j/Logger

У меня есть интересная проблема, в которой класс org.apache.log4j.Logger не найден во время выполнения. Я пытаюсь получить авторизацию, и в этом случае она не работает:

OAuthAuthorizer oauthAuthorizer = new OAuthAuthorizer(OAUTH_CONSUMER_KEY, OAUTH_CONSUMER_SECRET, SAML_PROVIDER_ID, userId);

Я использую JDeveloper 11.1.1.6. Вот что я знаю:

  • Я просмотрел каталог UI.war/WEB-INF/lib, и я вижу там log4j-1.2.17.jar.

  • Класс, жалующийся на это, - org.opensaml.xml.XMLConfigurator

    Caused by: java.lang.NoClassDefFoundError: org/apache/log4j/Logger
        at org.opensaml.xml.XMLConfigurator.<clinit>(XMLConfigurator.java:60)
        at org.opensaml.DefaultBootstrap.initializeXMLTooling(DefaultBootstrap.java:195)
        at org.opensaml.DefaultBootstrap.bootstrap(DefaultBootstrap.java:91)
        at com.intuit.ipp.aggcat.util.SAML2AssertionGenerator.getSAMLBuilder(SAML2AssertionGenerator.java:156)
        at com.intuit.ipp.aggcat.util.SAML2AssertionGenerator.createSubject(SAML2AssertionGenerator.java:187)
        at com.intuit.ipp.aggcat.util.SAML2AssertionGenerator.buildAssertion(SAML2AssertionGenerator.java:114)
        at com.intuit.ipp.aggcat.util.SAML2AssertionGenerator.generateSignedAssertion(SAML2AssertionGenerator.java:83)
        at com.intuit.ipp.aggcat.util.SamlUtil.createSignedSAMLPayload(SamlUtil.java:156)
        at com.intuit.ipp.aggcat.util.OAuthUtil.getOAuthTokens(OAuthUtil.java:60)
        at com.intuit.ipp.aggcat.core.OAuthAuthorizer.<init>(OAuthAuthorizer.java:85)
        at com.incomemax.view.intuit.WebUtil.getAggCatService(WebUtil.java:91)
    
    Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Logger
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:305)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:246)
        ... 64 more
    
  • Я разложил XMLConfigurator и странно, что он не импортирует org.apache.log4j.Logger Он использует org.slf4j.Logger, который также находится в моем каталоге jars (slf4j-api-1.7.5.jar). Также интересно, что строка 60 (см. Трассировку стека) является пустой линией в моем декомпилировании.

  • Конечно, если я добавлю Logger.xxxxx во время разработки, он найдет его в порядке.

  • Я использую код/​​банки непосредственно из образца java-кода, но импортирован в существующее приложение.

Я прочесываю сеть для ответов, и я считаю, что я проверил все области, о которых я могу думать. Я также ссылался на эту очень хорошую страницу: http://myarch.com/classnotfound/

Данная авторизация - это шаг 1 при использовании API-интерфейса Intuit Developer, я как бы застрял.

Добавление вывода из предложения @jhadesdev:

Все версии log4j Logger:

  • застежка-молния: C:/Users/Chris/AppData/Roaming/JDeveloper/system11.1.1.6.38.61.92/DefaultDomain/servers/DefaultServer/tmp/_WL_user/j2ee-app/lt5l71/war/WEB-INF/lib/log4j-1.2.17.jar!/org/apache/log4j/Logger.class

Все версии log4j, видимые из класса loader класса OAuthAuthorizer:

  • застежка-молния: C:/Users/Chris/AppData/Roaming/JDeveloper/system11.1.1.6.38.61.92/DefaultDomain/servers/DefaultServer/tmp/_WL_user/j2ee-app/lt5l71/war/WEB-INF/lib/log4j-1.2.17.jar!/org/apache/log4j/Logger.class

Все версии XMLConfigurator:

  • баночка: Файл:/C:/Oracle/Middleware11116/modules/com.bea.core.bea.opensaml2_1.0.0.0_6-1-0-0.jar/орг/opensaml/XML/XMLConfigurator.class

  • застежка-молния: C/Users/Chris/AppData/Roaming/JDeveloper/system11.1.1.6.38.61.92/DefaultDomain/servers/DefaultServer/tmp/_WL_user/j2ee-app/lt5l71/war/WEB-INF/lib/ipp-java-aggcat-v1-devkit-1.0.2.jar!/org/opensaml/xml/XMLConfigurator.class

  • застежка-молния: C/Users/Chris/AppData/Roaming/JDeveloper/system11.1.1.6.38.61.92/DefaultDomain/servers/DefaultServer/tmp/_WL_user/j2ee-app/lt5l71/war/WEB-INF/lib/xmltooling-1.3.1.jar!/org/opensaml/xml/XMLConfigurator.class

Все версии XMLConfigurator, видимые из загрузчика классов класса OAuthAuthorizer:

  • баночка: Файл:/C:/Oracle/Middleware11116/modules/com.bea.core.bea.opensaml2_1.0.0.0_6-1-0-0.jar/орг/opensaml/XML/XMLConfigurator.class

  • застежка-молния: C/Users/Chris/AppData/Roaming/JDeveloper/system11.1.1.6.38.61.92/DefaultDomain/servers/DefaultServer/tmp/_WL_user/j2ee-app/lt5l71/war/WEB-INF/lib/ipp-java-aggcat-v1-devkit-1.0.2.jar!/org/opensaml/xml/XMLConfigurator.class

  • застежка-молния: C/Users/Chris/AppData/Roaming/JDeveloper/system11.1.1.6.38.61.92/DefaultDomain/servers/DefaultServer/tmp/_WL_user/j2ee-app/lt5l71/war/WEB-INF/lib/xmltooling-1.3.1.jar!/org/opensaml/xml/XMLConfigurator.class

Я все еще работаю над интерпретацией результатов.

4b9b3361

Ответ 1

Во время выполнения ваше приложение не может найти банку.

Взято из этого Jared:

Важно сохранить два разных исключения прямо в нашей голове в этом случае:

  • java.lang.ClassNotFoundException. Это исключение указывает, что класс не найден на пути к классам. Это указывает на то, что мы были пытаясь загрузить определение класса, и класс не существовал на путь к классам.

  • java.lang.NoClassDefFoundError Это исключение указывает, что JVM     рассмотрел внутреннюю структуру данных определения класса для     определение класса и не нашел его. Это отличается от     говоря, что он не может быть загружен из класса. Обычно это     указывает, что мы ранее пытались загрузить класс из     classpath, но по какой-то причине он не удался - теперь мы снова пытаемся,     но мы даже не собираемся его загружать, потому что мы потерпели неудачу     загружая его раньше. Более ранний отказ может быть     ClassNotFoundException или ExceptionInInitializerError (указывает     сбой в статическом блоке инициализации) или любое другое     проблемы. Дело в том, что NoClassDefFoundError не обязательно является     classpath.

для сходств и различий

Ответ 2

Вы можете использовать следующую зависимость maven в вашем файле pom. В противном случае вы можете загрузить следующие две банки из сети и добавить их в свой путь сборки.

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.6.4</version>
</dependency>

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.6.4</version>
</dependency>

Это скопировано из моего рабочего проекта. Сначала убедитесь, что он работает в вашем проекте. Затем вы можете изменить версии, чтобы использовать любые другие (версии) совместимые банки.

Для AggCat вы можете ссылаться на файл POM образца Java-приложения.

https://github.com/IntuitDeveloperRelations/IPP_Sample_Code/blob/master/CustomerAccountData/Java/AggCatSampleApplication/pom.xml

Спасибо

Ответ 3

На основе stacktrace класс intuit com.intuit.ipp.aggcat.util.SAML2AssertionGenerator нуждается в бассете saml в пути к классам.

Класс saml org.opensaml.xml.XMLConfigurator нуждается в том, чтобы включить log4j, который находится внутри WAR, но не может его найти.

Одно из объяснений этого заключается в том, что класс XMLConfigurator, который нуждается в log4j, был найден не внутри WAR, а в загрузчике класса downstream. может ли отсутствовать saml jar из WAR?

Класс XMLConfigurator, который нуждается в log4j, не может найти его на уровне загрузчика классов, который его загрузил, а версия log4j на WAR не видна в этом конкретном загрузчике классов.

Чтобы устранить эту проблему, следует добавить это перед вызовом oauth:

System.out.println("all versions of log4j Logger: " + getClass().getClassLoader().getResources("org/apache/log4j/Logger.class") );

System.out.println("all versions of XMLConfigurator: " + getClass().getClassLoader().getResources("org/opensaml/xml/XMLConfigurator.class") );

System.out.println("all versions of XMLConfigurator visible from the classloader of the OAuthAuthorizer class: " + OAuthAuthorizer.class.getClassLoader().getResources("org/opensaml/xml/XMLConfigurator.class") );

System.out.println("all versions of log4j visible from the classloader of the OAuthAuthorizer class: " + OAuthAuthorizer.class.getClassloader().getResources("org/apache/log4j/Logger.class") );

Также, если вы используете Java 7, посмотрите jHades, это инструмент, который я сделал, чтобы помочь устранить эти проблемы,

Чтобы узнать, что происходит, вы могли бы опубликовать результаты вышеперечисленных запросов класса, для которых это происходит, tomcat, jetty? Лучше всего поставить полную стеклу со всем, вызванным в pastebin, на всякий случай.

Ответ 4

С предложениями @jhadesdev и объяснениями от других я нашел здесь проблему.

После добавления кода, чтобы увидеть, что было видно для различных загрузчиков классов, я нашел это:

All versions of log4j Logger: 
  zip:<snip>war/WEB-INF/lib/log4j-1.2.17.jar!/org/apache/log4j/Logger.class

All versions of log4j visible from the classloader of the OAuthAuthorizer class: 
  zip:<snip>war/WEB-INF/lib/log4j-1.2.17.jar!/org/apache/log4j/Logger.class

All versions of XMLConfigurator: 
  jar:<snip>com.bea.core.bea.opensaml2_1.0.0.0_6-1-0-0.jar!/org/opensaml/xml/XMLConfigurator.class
  zip:<snip>war/WEB-INF/lib/ipp-java-aggcat-v1-devkit-1.0.2.jar!/org/opensaml/xml/XMLConfigurator.class
  zip:<snip>war/WEB-INF/lib/xmltooling-1.3.1.jar!/org/opensaml/xml/XMLConfigurator.class

All versions of XMLConfigurator visible from the classloader of the OAuthAuthorizer class: 
  jar:<snip>com.bea.core.bea.opensaml2_1.0.0.0_6-1-0-0.jar!/org/opensaml/xml/XMLConfigurator.class
  zip:<snip>war/WEB-INF/lib/ipp-java-aggcat-v1-devkit-1.0.2.jar!/org/opensaml/xml/XMLConfigurator.class
  zip:<snip>war/WEB-INF/lib/xmltooling-1.3.1.jar!/org/opensaml/xml/XMLConfigurator.class

Я заметил, что другая версия XMLConfigurator, возможно, была поднята. Я декомпилировал этот класс и нашел это на строке 60 (где ошибка была в исходной трассировке стека) private static final Logger log = Logger.getLogger(XMLConfigurator.class);, и этот класс импортировал из org.apache.log4j.Logger!

Итак, этот класс загружался и использовался. Мое исправление заключалось в том, чтобы переименовать файл jar, содержащий этот файл, поскольку я не могу найти, где я явно или косвенно загружаю его. Это может создать проблему при фактическом развертывании.

Спасибо за всю помощь и очень необходимый урок по загрузке классов.

Ответ 5

Если бы та же проблема, это было действительно вызвано weblogic глупо, используя свою собственную реализацию opensaml. Чтобы решить эту проблему, вы должны сказать ей, чтобы загружать классы из WEB-INF/lib для этого пакета в weblogic.xml:

    <prefer-application-packages>
        <package-name>org.opensaml.*</package-name>
    </prefer-application-packages>

возможно, <prefer-web-inf-classes>true</prefer-web-inf-classes> тоже будет работать.

Ответ 6

Завершите сборку развертывания,

У меня такая же ошибка, когда я генерирую файл войны с помощью метода "maven clean install" и разворачиваю его вручную, он отлично работает, но когда я использую среду среды выполнения (eclipse), проблемы возникают.

Решение для меня (для eclipse IDE) переходите к: "proyect properties" → "Deployment Assembly" → "Добавить" → "банку, в которой вы нуждаетесь", в моем случае java "записи пути сборки" ". Может быть, может помочь litle!

Ответ 7

java.lang.ClassNotFoundException указывает, что класс не найден в пути класса. это может быть версия log4j несовместима. проверьте для версии log4j.