Вызвано: java.ленг.Ошибке типа noclassdeffounderror: орг/Апач/к log4j/регистратор

у меня есть интересная проблема, в которой орг.апаш.log4j.Класс Logger не найден во время выполнения. Я пытаюсь получить разрешение, и именно там он терпит неудачу:

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

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

  1. Я посмотрел в моем пользовательском интерфейсе.каталог war / WEB-INF/lib, и я вижу log4j-1.2.17.баночка там.

  2. класс жалуется на это орг.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.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
    
  3. Я decomplied XMLConfigurator и странно это не импорт орг.апаш.log4j.Logger использует org.slf4j.Logger, который также находится в моем каталоге jars (slf4j-api-1.7.5.сосуд.) Также интересно, что строка 60 (см. трассировку стека) является пустой строкой в моей декомпиляции.

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

  5. Я использую код / jars непосредственно из примера кода java, но импортируется в мое существующее приложение.

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

учитывая, что авторизация-это шаг 1 в использовании API разработчика Intuit, я немного застрял.

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

все варианты из к log4j регистратор:

  • zip: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.Джар!/ org/apache/log4j / Logger.класс!--13-->

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

  • zip: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.Джар!/ org/apache/log4j / Logger.класс!--13-->

все версии XMLConfigurator: версии xmlconfigurator, видимые из загрузчика классов OAuthAuthorizer все еще работаем над интерпретацией результатов.

8 ответов


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

принято от ответ by Джаред:

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

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

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

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


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

<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

спасибо


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

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

решение для меня (для Eclipse IDE) перейдите к: "свойства proyect" --> "сборка развертывания" --> "добавить" --> "jar вам нужно", в моем случае java "build Path entries". Может быть, поможет немного!


на основе stacktrace, класс intuit com.созерцать.ipp.aggcat.утиль.SAML2AssertionGenerator должен SAML и фляги в classpath.

SAML и класс org.opensaml.XML.XMLConfigurator нуждается в повороте log4j, который находится внутри войны, но не может его найти.

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

класс 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, это инструмент, который я сделал, чтобы помочь устранить эти проблемы.

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


С предложениями @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, содержащего этот файл, поскольку я не могу найти, где я его явно или косвенно загружаю. Что может создать проблему, когда я развернусь.

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


была та же проблема, это действительно было вызвано 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> тоже будет работать.


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


У меня была такая же проблема, для меня это проблема:
щелкните правой кнопкой мыши проект - >maven - > обновить проект

maven -> update project