[解決済み] 原因: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をインポートしていません。また、興味深いのは、60行目(スタックトレースを参照)が私のデコンパイルで空白行であることです。
-
もちろん、設計時にLogger.xxxxを追加すれば、うまく見つかります。
-
私はサンプルのJavaコードから直接コード/jarを使用していますが、既存のアプリケーションにインポートしています。
Webで回答を探し回り、思い当たるところはすべてチェックしたつもりです。また、このとても良いページも参考にしました。 http://myarch.com/classnotfound/
Intuit Developer API を使用する際のステップ 1 は認証であることを考えると、ちょっと困ってしまいますね。
jhadesdev さんの提案の出力を追加しました。
log4j Loggerのすべてのバージョン。
- 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_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_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ファイルの名前を変更することでした。なぜなら、明示的または間接的にこのファイルをロードする場所が見つからないからです。これは、実際にデプロイするときに問題になるかもしれません。
この度は、クラスローディングについて教えていただきありがとうございました。
関連
-
[解決済み】"実引数リストと形式引数リストの長さが異なる"
-
[解決済み】javaで指定されたファイルが見つからない
-
[解決済み】エラー「No enclosing instance of type Foo is accessible」の原因と修正方法について教えてください。
-
[解決済み】Android Studioでタスク :app:compileDebugJavaWithJavac の実行に失敗しました。
-
[解決済み】Eclipseがエラーメッセージ "Java was started but returned exit code = 1" を返す
-
[解決済み】Javaで無限大を実装する方法とは?
-
[解決済み】koch snowflake java recursion
-
[解決済み] java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException を解決するには?
-
[解決済み] logger(log4j)のアペンダーが見つかりませんでしたか?
-
[解決済み】Apache Camelとは一体何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】"比較メソッドはその一般契約に違反する!"
-
[解決済み】Doubleはdereferencedできない?
-
[解決済み】Hibernateの例外「failed to lazily initialize a collection of role」の解決方法
-
[解決済み】java.io.IOException: 壊れたパイプ
-
[解決済み】ソースルート外のJavaファイル intelliJ
-
[解決済み】intがnullであるかどうかを確認する方法
-
[解決済み】予期しない型エラー
-
[解決済み] "java.nio.charset.MalformedInputException" を避けるために、すべての包括的なCharset。入力の長さ= 1"?
-
[解決済み] JavaでNoClassDefFoundErrorが発生するのはなぜですか?
-
[解決済み】NoClassDefFoundErrorとClassNotFoundExceptionの原因や違いは何ですか?