実行時に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をインポートしません。これは、私のjarsディレクトリ(slf4j-api-1.7.5.jar)にもあるorg.slf4j.Loggerを使用します。また興味深いのは、行60(スタックトレースを参照)が私の逆コンパイルの空白行であることです。
もちろん、設計時にLogger.xxxxxを追加しても、問題なく見つかります。
サンプルJavaコードから直接コード/ jarを使用していますが、既存のアプリケーションにインポートします。
私は答えを求めてウェブを精査してきましたが、考えられるすべての分野をチェックしたと思います。この非常に良いページも参照しました: http://myarch.com/classnotfound/
Intuit Developer APIを使用する場合の承認がステップ1であることを考えると、ちょっと立ち往生しています。
@jhadesdev提案からの出力の追加:
Log4jロガーのすべてのバージョン:
OAuthAuthorizerクラスのクラスローダーから表示可能なlog4jのすべてのバージョン:
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
私はまだ結果の解釈に取り組んでいます。
@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ファイルの名前を変更することでした。実際に展開するときに問題が発生する可能性があります。
すべての助けとクラスのロードに関する非常に必要なレッスンをありがとう。
実行時に、アプリケーションはjarを見つけることができません。
this answer by Jared から取得:
この場合、頭の中で2つの異なる例外をまっすぐに保つことが重要です。
Java.lang.ClassNotFoundExceptionこれは
Exception
であり、クラスパスでクラスが見つからなかったことを示します。これは、クラス定義をロードしようとしており、クラスがクラスパスに存在しなかったことを示しています。Java.lang.NoClassDefFoundErrorこれは
Error
です。これは、JVMが内部クラス定義データ構造でクラスの定義を検索し、それを見つけられなかったことを示します。これは、クラスパスからロードできなかったということとは異なります。通常、これは以前にクラスパスからクラスをロードしようとしましたが、何らかの理由で失敗したことを示しています-今、もう一度試みていますが、ロードに失敗したため、ロードしようとさえしません。以前の失敗は、ClassNotFoundExceptionまたはExceptionInInitializerError(静的初期化ブロックの失敗を示す)、または他の多くの問題です。ポイントは、NoClassDefFoundErrorは必ずしもクラスパスの問題ではないということです。
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ファイルを参照できます。
ありがとう
展開アセンブリをチェックインし、
「maven clean install」方法でwarファイルを生成し、手動でデプロイすると同じエラーが発生しますが、正常に動作しますが、ランタイム環境(Eclipse)を使用すると問題が発生します。
私のソリューション(Eclipse IDEの場合)は、「proyect properties」->「Deployment Assembly」->「Add」->「必要なjar」、私の場合はJava "ビルドパスエントリ」。たぶん、ちょっとした助けになるでしょう!
スタックトレースに基づいて、直観クラス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に入れる方がよいでしょう。
同じ問題を抱えていたのは、実際に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.lang.ClassNotFoundExceptionは、クラスがクラスパスで見つからないことを示します。 log4jのバージョンに互換性がない可能性があります。異なるlog4jバージョンを確認してください。