問題タブ [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 に答える
1052 参照

spring - Liferay サービス ビルダーの JNDI ルックアップが間違った命名コンテキストを使用する

JNDI を介して構成されたサービスビルダー ポートレットがあります。

私のext-spring.xmlでは、次を使用してその値を取得しようとしています。

ただし、InitialContextこの値を検索するために使用される は、含まれているのはデータベース接続プールだけでInitialContextあるため、ROOTwebapp (liferay 自体) のようです。JNDI コンテキストは、次によって決定されるjava:comp/env/jdbc/LiferayPoolに関連付けられていることを知っています。ClassLoader

また、ポートレットの初期化を実行する前に、liferay がクラスローダーをいじることも知っています。しかし、私の人生では、これを回避する方法を理解することはできません。助言がありますか?

0 投票する
2 に答える
410 参照

java - 同じクラスパスで getResourceAsStream が null を返す場合と返さない場合がある

同じアプリケーションの 2 つの派生物、たとえばバージョン (A) と (B) があります。それぞれにプロジェクトが含まれています: (1) を含む test-data-war、 (2)およびtarget/test-classes/log4j.propertiesを含む test-kernel 。target/test-classes/log4j.propertiestarget/test-classes/test.properties

Thread.currentThread().getContextClassLoader().getResourceAsStream(resourceName);(1) で特定の jUnit テストを実行すると、(2) で(A)を呼び出すメソッドが呼び出さ resourceNameれ、「log4j.properties」として、結果は (1) のパスで null ではなく、resourceName「test.properties」としてnullです。(B) では、resourceName「log4j.properties」として (1) のパスで null ではなくresourceName、「test.properties」として (2) のパスで null ではありません。

Thread.currentThread().getContextClassLoader().getResourceAsStream("test.properties");(A) に nullがあるのはなぜですか? 最初はクラスパスが違うのではないかと思っていましたが、(1)も(2)も同じです。

編集: (1) の .classpath ファイルは次のようになります。

(2) の .classpath ファイルは次のようになります。

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

java - 異なる Web アプリケーションで同じクラスローダーを共有するにはどうすればよいですか?

アプリケーションのスイートがあります。現時点では、各アプリケーションを個別にデプロイすることも、組み合わせてデプロイすることもできます。問題は、各戦争が独自のライブラリのコピーで構築されていることです。その多く (LOTS) が各戦争で複製されます。

Tomcat の共​​通領域にライブラリを配置すれば、それらはすべてそれらのリソースを共有できます。ただし、各アプリケーションを起動時に、別のアプリケーションがロードしようとしているクラスを既にロードしているかどうかを確認し、別のアプリケーションがロードしている場合は、独自のバージョンを再ロードする代わりにそれらを使用する方法はありますか?

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

java - 依存 jar クラスが URLClassloader からロードされない

JARファイルのリストを読み取り、各jarを使用してロードしているアプリケーションを実行していますが、別のJARから別のクラスを参照している1つのJARからURLClassLoaderをロードしているときに、 .ClassNoClassDefError

別のJARのクラスを参照しているため、クラスのNoClassDefErrorロード中に常に取得しています。DemoDemo2

誰か助けてくれませんか?

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

java - 親子クラスローダのクラス解決

タスクと初期調査

1 つの Java Swing アプリケーションで 2 つの Oracle Coherence ニア キャッシュ インスタンスを設定しようとしています。解決策のアイデアはここにあります。私のケースはもう少し複雑で、ここからゲームが始まります。

簡単な説明

私の場合、アカウント サービスがあります。SIT と UAT の 2 つのエンドポイントを持つことができます。このようなサービスを 2 つ作成するには、システム変数 ( tangosol.coherence.cacheconfig ) でエンドポイントをオーバーライドするために、Coherence の 2 つの「インスタンス」をロードする必要があります。

私は持っている:

  • アプリのメイン コードは mainapp.jar にあります。
  • account-interfaces.jar にあるAccountServiceインターフェース。
  • account-impl.jar にあり、AccountServiceインターフェースを実装するAccountServiceImplクラス。
  • 私の主なアプリケーションは次の構造を持っています

試みたアプローチ

私は専用の子優先クラスローダー - InverseClassLoader を作成し、AppLaunchClassLoader (デフォルトの Thread.currentThread().GetContextClassLoader() クラスローダー) を親にしました。InverseClassLoader を使用して、AccountServiceImpl クラスをロードします。

問題と質問

  1. 「AccountServiceImpl を AccountService にキャストできません」という例外が発生します。これは、これら 2 つのクラスが異なるクラスローダーによってロードされたことを意味します。しかし、それらのクラスローダは親子関係にあります。クラスが親 (インターフェース - 'abstract' タイプ) によってロードされたとしても、子クラスローダーによってロードされたクラス (concrete impl) では使用できないというのは正しいですか? では、なぜこの親子関係が必要なのでしょうか。
  2. コードで AccountService インターフェイスを指定したところ、デフォルトのクラスローダーによって読み込まれました。上記のコードをスレッドにラップして、コンテキストクラスローダーである InverseClassLoader を設定しようとしました。何も変わっていません。そのようなインターフェイス実装コーディング (通常のコーディング) を使用できず、常にリフレクションを使用して具体的なメソッドを常に呼び出す必要があるというのは正しいですか? (解決策があることを願っています);
  3. たとえば、InverseClassLoader によって読み込まれる AccountService クラスと AccountServiceImpl クラスの両方をリストしました。これら 2 つのクラスからアクセスできる他のクラスを、InverseClassLoader によってもロードする必要がある場合はどうすればよいでしょうか? すべての「関連する」クラスを同じクラスローダーでロードする必要があると言う方法はありますか?

アップデート

InverseClassLoader は次のとおりです。

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

java - Thread.setContextClassLoader は、getCCL によって返されるものとは異なる ClassLoader を設定できますか?

バックグラウンド:

最近、特定の操作に適切な ClassLoader を設定し、操作が完了すると元の ClassLoader を復元するコードを実装しました。

例えば:

ドキュメントによると、getContextClassLoader()返される null は 2 つのことを意味する可能性があります。1) システム CL または 2) sys CL の取得に失敗した場合は、ブートストラップ CL。

戻り値:この Thread のコンテキスト ClassLoader、またはシステム クラス ローダー (または、失敗した場合はブートストラップ クラス ローダー) を示す null

ドキュメントによるとsetContextClassLoader(Classloader cl)、null CL が提供されている場合は、1) システム CL、または 2) sys CL の設定に失敗した場合はブートストラップ CL のいずれかです。

cl - この Thread のコンテキスト ClassLoader、またはシステムクラスローダー (または、失敗した場合はブートストラップクラスローダー) を示す null


質問:

上記の try-finally-restore プログラミング モデルを使用すると、スレッド上で最初に使用したものとは異なる ClassLoader になる可能性はありますか?

例えば:

setContextClassLoader(null)Bootstrap CL で開始し、System CLを使用して復元しようとすると、この逆も当てはまります。どちらの場合も可能ですか?

0 投票する
2 に答える
82 参照

tomcat - Instantiating a tomcat WEB-INF\class\myclass from tomcat lib using classloader

I am trying to load a class present in a war file in tomcat from a class in a jar in tomcat lib. I am doing this using Class.forname("myclass") but the application is throwing class not found exception. i guess this is because the webapp will have its own class loader. can someone suggest how to fix this

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

java - OSGi フレームワーク内で Esper を使用する

OSGi フレームワーク内で Esper を使用したいのですが、OSGi 内のクラスローディング メカニズムで達成する必要があることをどのように許可するのか、さらには OSGi 内で Esper をどのように使用できるのかさえわかりません。

Dynamic-ImportEsper 5.3 を使用していますが、バンドル マニフェストを調べたところ、 OSGi ヘッダーが使用されていません。Esper の中心にあるのは、POJO で動作する SQL クエリであると私が理解している EPStatements です。

私が理解するのに苦労しているのは、動的インポートを使用せず、将来的に操作するように指示される可能性のある POJO に関する知識がない Esper バンドルがそれらにアクセスする方法です。

たとえば、EPStatement を作成しようとすると、次のようになります。

select * com.example.Pojo

クラス com.example.Pojo が Esper コアへの別のバンドルにある場合、Pojoロードできる唯一の方法は、そのClassLoader を使用することです。これは次の方法で実行できます。

Pojoしかし、これは Pojo 自体を含むバンドルのクラス空間にロードされるだけではありませんか? 上記の例の EPStatement を作成するときに必要になるように、Esper バンドルがそれにアクセスするにはどうすればよいですか。

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

java - Tomcat 7 - JAAS レルムが Web アプリケーション クラス ファイルにアクセスできない

私はこの問題について過去 3 週間頭を悩ませてきましたが、ソース コードがないため、できるだけ簡単に説明するように努めています。

  1. プラットホーム

. トムキャット 7
. ウィンドウ サーバー 2008
。JRE 7

  1. Tomcat JAAS レルムの使用

Web アプリケーション META-INF/context.xml で定義されます。

  1. ソースコードを持っていないので、ここが難しい部分です。

WEB-INF/classes/a123 & b123 クラス ファイルがあります。

. このクラス a123 は logincontext を使用します
。logincontext には、いくつかの構成が定義されています
。この構成ファイルは、b123 にアクセスするために必要な JAAS レルムの一部であると私は信じています。

問題。クラス b123 が見つかりません。

この問題は、Tomcat JAAS レルムが Tomcat サーバー上にあり、b123 が webappsclassloader の下にあるため、b123 が見つからないことが原因だと思います。

したがって、context.xml でわかるように、useContextClassLoader="true" を設定しました。これは、デフォルトで webappsclassloader であると考えています。

b123 を Tomcat スタートアップ クラスパスに配置しようとしましたが、これは機能しますが、b123 のコピーが 2 つあると思います。

. Tomcat サーバーの下の b123
。webappsclassloader の下の b123

ここでの問題は、クラス読み込み階層の上位クラスが下位階層の Web アプリ クラスにアクセスしようとしていると思います。クラスローディングの委譲が機能する方法に基づいて、それは間違いなく失敗します。したがって、どちらが機能するかを考える唯一の方法は、スレッドコンテキストクラスローダーを使用することです。

context.xml でわかるように、useContextClassLoader を「true」に設定しました。しかし、ソース コードにアクセスできないため、Tomcat 構成を介してコンテキスト クラス ローダーを設定するにはどうすればよいでしょうか? JAAS レルムがコンテキスト クラス ローダーを使用する前に、コンテキスト クラス ローダーを設定する必要があると思います。

どんな助けでも素晴らしいでしょう!

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

android - アプリが activityA から activityB に移動するときに、呼び出し元クラスの名前を取得するにはどうすればよいですか?

現在のアクティビティから呼び出し元クラスの名前を取得する関数が必要です。実際、 getClassLoader 関数を介して呼び出し元クラスの名前を取得する方法を知りたいです。

ところで、これが私の前の質問ですが、受け入れられる回答が得られませんでした。 ここ