問題タブ [contextclassloader]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - クラスローダーは、メソッド内で宣言された拡張クラスのインスタンスをどのようにロードしますか? (java.lang.NoClassDefFoundError)
util 関数を持ち、オンデマンドで呼び出すことができるクラスがあります。
再現する手順 :
- TestMainWebApp (TestMainImp の依存関係を持つこのプロジェクト)
- TestMainImpl (このプロジェクトは TestMainInterface を実装します)
- TestMainInterface
TestMainWebApp > TestMainServlet.java
TestMainImpl > Util.java & TLSErrorRedirectListener.java
TLSErrorRedirectionListener.java
TestMainInterface > ConfigurationListener.java
場合 :
- TestMainInterface.jar は TestMainImpl.jar のクラスパスになります (@compiletime のみ)
- 実行時に (TestMainInterface.jar はありません)、メソッド "checkForTLSErrorRedirection()" を呼び出しません。私は test() メソッドのみを呼び出します。
しかし、インスタンス自体を作成すると、 java.lang.NoClassDefFoundError: test/intf/ConfigurationListener を取得しています。
根本的な原因を見つけるのを手伝ってもらえますか? Java はメソッド内で宣言された Class をどのようにロードしますか?
注 : デバッグ用のJavaEETrainingUtil.java
java - Thread.currentThread().getContextClassLoader() の動作が Jetty 9.4.37.v20210219 と異なる
Jetty バージョンから Web アプリケーション内にリソース ファイルをロードする際に問題に直面しています9.4.37.v20210219
。
Thread.currentThread().getContextClassLoader()
クラスローダーインスタンスを取得してから、リソースをストリームとして取得しようとしていますclassLoader.getResourceAsStream("resourceFileName")
。このコード行は、jetty バージョンから null を返します9.4.37.v20210219
。
クラスローダのインスタンスを jetty バージョン9.4.37.v20210219
とでログに記録して比較検討すると9.4.36.v20210114
、以下の違いがわかります
桟橋9.4.37.v20210219で、私は得る
startJarLoader@1c4af82c
しかし、jetty 9.4.36.v20210114 を使用すると、
WebAppClassLoader{984235065}@3aaa3c39
startJarLoader は jetty サーバーのクラスパスを示していますか? webapp からリソース ファイルを読み込む標準的な方法は何ですか?
追加情報、私の Web アプリケーションはデプロイされJETTY_BASE/webapps
ており、その中にロードしようとしているリソース ファイルがあります。この webapp には、 にデプロイされた依存関係の jar がありJETTY_BASE/lib/ext
ます。Thread.currentThread().getContextClassLoader()
依存関係の jar から呼び出される webapp 内のメソッドで使用されます。つまり、呼び出されたスレッドは webapp の依存関係 jar に属し、サーバー クラスパス/親クラス ローダーにあります。これが私が推測する理由ですが、この違いがjetty9.4.37.v20210219
以降のバージョンで見られる理由を知りたいです。
ところで、MyClass.class.getClassLoader()
リターンWebAppClassLoader{984235065}@3aaa3c39
を行うと、同じものを使用してリソースをストリームとして取得できましたclassLoader.getResourceAsStream("resourceFileName")
が、 jetty version との動作に違いがある理由を知りたい9.4.37.v20210219
です。
どんな助けにも感謝します!前もって感謝します!