web-dev-qa-db-ja.com

原因: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を使用しています。私が知っていることは次のとおりです。

  1. UI.war/WEB-INF/libディレクトリを確認しましたが、そこにlog4j-1.2.17.jarがあります。

  2. それについて不平を言っているクラスは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
    
  3. 私はXMLConfiguratorを展開しましたが、奇妙なことにorg.Apache.log4j.Loggerをインポートしません。これは、私のjarsディレクトリ(slf4j-api-1.7.5.jar)にもあるorg.slf4j.Loggerを使用します。また興味深いのは、行60(スタックトレースを参照)が私の逆コンパイルの空白行であることです。

  4. もちろん、設計時にLogger.xxxxxを追加しても、問題なく見つかります。

  5. サンプルJavaコードから直接コード/ jarを使用していますが、既存のアプリケーションにインポートします。

私は答えを求めてウェブを精査してきましたが、考えられるすべての分野をチェックしたと思います。この非常に良いページも参照しました: http://myarch.com/classnotfound/

Intuit Developer APIを使用する場合の承認がステップ1であることを考えると、ちょっと立ち往生しています。

@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.jar!/org/Apache/log4j/Logger.class

OAuthAuthorizerクラスのクラスローダーから表示可能な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.jar!/org/Apache/log4j/Logger.class

XMLConfiguratorのすべてのバージョン:

  • jar:file:/ C:/Oracle/Middleware11116/modules/com.bea.core.bea.opensaml2_1.0.0.0_6-1-0-0.jar!/org/opensaml/xml/XMLConfigurator.class

  • 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/ipp-Java -aggcat-v1-devkit-1.0.2.jar!/org/opensaml/xml/XMLConfigurator.class

  • 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/xmltooling-1.3 .1.jar!/org/opensaml/xml/XMLConfigurator.class

OAuthAuthorizerクラスのクラスローダーから表示できるXMLConfiguratorのすべてのバージョン:

  • jar:file:/ C:/Oracle/Middleware11116/modules/com.bea.core.bea.opensaml2_1.0.0.0_6-1-0-0.jar!/org/opensaml/xml/XMLConfigurator.class

  • 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/ipp-Java -aggcat-v1-devkit-1.0.2.jar!/org/opensaml/xml/XMLConfigurator.class

  • 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/xmltooling-1.3 .1.jar!/org/opensaml/xml/XMLConfigurator.class

私はまだ結果の解釈に取り組んでいます。

37
lovebeer84

@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ファイルの名前を変更することでした。実際に展開するときに問題が発生する可能性があります。

すべての助けとクラスのロードに関する非常に必要なレッスンをありがとう。

3
lovebeer84

実行時に、アプリケーションはjarを見つけることができません。

this answer by Jared から取得:

この場合、頭の中で2つの異なる例外をまっすぐに保つことが重要です。

  1. Java.lang.ClassNotFoundExceptionこれはExceptionであり、クラスパスでクラスが見つからなかったことを示します。これは、クラス定義をロードしようとしており、クラスがクラスパスに存在しなかったことを示しています。

  2. Java.lang.NoClassDefFoundErrorこれはErrorです。これは、JVMが内部クラス定義データ構造でクラスの定義を検索し、それを見つけられなかったことを示します。これは、クラスパスからロードできなかったということとは異なります。通常、これは以前にクラスパスからクラスをロードしようとしましたが、何らかの理由で失敗したことを示しています-今、もう一度試みていますが、ロードに失敗したため、ロードしようとさえしません。以前の失敗は、ClassNotFoundExceptionまたはExceptionInInitializerError(静的初期化ブロックの失敗を示す)、または他の多くの問題です。ポイントは、NoClassDefFoundErrorは必ずしもクラスパスの問題ではないということです。

類似点と相違点

30
Premraj

Pomファイルで次のMaven依存関係を使用できます。それ以外の場合は、次の2つのjarをネットからダウンロードして、ビルドパスに追加できます。

<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>

これは私の作業プロジェクトからコピーされます。まず、プロジェクトで機能していることを確認します。その後、バージョンを変更して、他の(バージョン)互換jarを使用できます。

AggCatの場合、サンプルJavaアプリケーションのPOMファイルを参照できます。

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

ありがとう

10
Manas Mukherjee

展開アセンブリをチェックインし、

「maven clean install」方法でwarファイルを生成し、手動でデプロイすると同じエラーが発生しますが、正常に動作しますが、ランタイム環境(Eclipse)を使用すると問題が発生します。

私のソリューション(Eclipse IDEの場合)は、「proyect properties」->「Deployment Assembly」->「Add」->「必要なjar」、私の場合はJava "ビルドパスエントリ」。たぶん、ちょっとした助けになるでしょう!

8
perezmirabile

スタックトレースに基づいて、直観クラスcom.intuit.ipp.aggcat.util.SAML2AssertionGeneratorにはクラスパスにsaml jarが必要です。

Samlクラスorg.opensaml.xml.XMLConfiguratorは、log4jのターンを必要とします。log4jはWAR内にありますが、見つかりません。

これの1つの説明は、log4jを必要とするクラスXMLConfiguratorがWAR内ではなく、ダウンストリームクラスローダー上で見つかったということです。 WARからsaml jarが欠落している可能性はありますか?

Log4jを必要とするクラスXMLConfiguratorは、それをロードしたクラスローダーのレベルでそれを見つけることができず、WARのlog4jバージョンはその特定のクラスローダーで表示されません。

これをトラブルシューティングするには、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 を参照してください。これは、これらのタイプの問題のトラブルシューティングを支援するために作成したツールです。

何が起こっているのかを見るために、上記のクラスパスクエリの結果を投稿できますか?万が一のために、すべての原因を貼り付けたスタックトレースをPastebinに入れる方がよいでしょう。

4

同じ問題を抱えていたのは、実際に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>も動作するでしょう。

3
Denis Tulskiy

Java.lang.ClassNotFoundExceptionは、クラスがクラスパスで見つからないことを示します。 log4jのバージョンに互換性がない可能性があります。異なるlog4jバージョンを確認してください。

1
Dharmraj

私は同じ問題を抱えていました、私にとってこれは問題を修正しました:
プロジェクトを右クリック-> maven->プロジェクトを更新

maven -> update project

0
user648026