問題タブ [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.

0 投票する
1 に答える
51 参照

java - クラスローダーは、メソッド内で宣言された拡張クラスのインスタンスをどのようにロードしますか? (java.lang.NoClassDefFoundError)

util 関数を持ち、オンデマンドで呼び出すことができるクラスがあります。

再現する手順 :

  1. TestMainWebApp (TestMainImp の依存関係を持つこのプロジェクト)
  2. TestMainImpl (このプロジェクトは TestMainInterface を実装します)
  3. TestMainInterface

TestMainWebApp > TestMainServlet.java

TestMainImpl > Util.java & TLSErrorRedirectListener.java

TLSErrorRedirectionListener.java

TestMainInterface > ConfigurationListener.java

場合 :

  1. TestMainInterface.jar は TestMainImpl.jar のクラスパスになります (@compiletime のみ)
  2. 実行時に (TestMainInterface.jar はありません)、メソッド "checkForTLSErrorRedirection()" を呼び出しません。私は test() メソッドのみを呼び出します。

  3. しかし、インスタンス自体を作成すると、 java.lang.NoClassDefFoundError: test/intf/ConfigurationListener を取得しています。

根本的な原因を見つけるのを手伝ってもらえますか? Java はメソッド内で宣言された Class をどのようにロードしますか?

注 : デバッグ用のJavaEETrainingUtil.java

0 投票する
0 に答える
59 参照

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です。

どんな助けにも感謝します!前もって感謝します!