問題タブ [serviceloader]

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 に答える
1267 参照

java - 必要のないときに JVM からアンロードするために、さまざまなクラスローダーでクラスをロードする

私のアプリケーションでは、ServiceLoader を使用してモジュール (.jar ファイルからのクラス) を異なる ClassLoader でロードし、アプリケーションのコンテキストおよび JVM 自体から不要なときに完全にアンロードします。「JVMからクラスをアンロードする」というのは一般的なトピックではないかもしれませんが、それにはいくつかの条件があるので、必要な努力をしています。すべてが期待どおりに機能しているかどうかを確認するために、-XX:+TraceClassLoading と -XX:+TraceClassUnloading を使用してクラスのロードとアンロードをトレースしています。このパラメーターからの情報は、任意のモジュールを完全にアンロードできることを示しています。 mi アプリおよび JVM 自体から (JVM からのアンロードは完全な GC 中に発生します)。これはすべてうまくいくようです...しかし、私の質問は、モジュールクラスがロードされた場所からの.jarファイルがJVMによって開かれたままになっているのはなぜですか? jar は削除できませんが、JVM はそれらからクラスをアンロードしたと言います。明らかにこれは JVM の実行中ですが、JVM にクラスがロードされていないのに、なぜその .jar ファイルを開いたままにしておくのでしょうか? JVM に強制的にその .jar ファイルを解放させるためにできることはありますか?

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

java - Eclipse プラグインでの ServiceLoader のテスト

私のワークスペースには 4 つの Eclipse プラグイン プロジェクトがあります (新しい Java プロジェクトを作成し、右クリックして構成し、プラグイン プロジェクトに変換します)。最初の ( my.runtime) には、インターフェース ( ) と、そのインターフェースのすべての実装をロードしてメソッド ( )を呼び出し、結果を収集してリストに返すメソッド ( ) を定義するMyFactoryInterfaceクラス ( ) が含まれています。MyClientList<String> getAllFactoryNames()java.util.ServiceLoaderString getName()

そのクラスをテストするために、2 番目のプロジェクト ( my.runtime.test、Fragment-Host で設定my.runtime) に JUnit テストを用意し、プロジェクトにあるダミーの実装 ( MyDummy、戻り"Dummy")によって返された名前が によって返さmy.runtime.testれたリストにあるかどうかを確認しMyClient.getAllFactoryNames()ます。これまでのところ、問題なく動作しています。

3 番目のプロジェクト ( my.extension、依存関係あり) には、返された名前を使用して挨拶のリスト ( ) を返すmy.runtimeクラス ( ) があります。MyHelloMyClient.getAllFactoryNames()"Hello "+name

繰り返しますが、これをテストするために、別の実装 ( 、名前として返される) を含むプロジェクト ( my.extension.testmy.extensionFragment-Hostとして) と、によって返されるグリーティングに が含まれているかどうかをチェックする JUnit テスト ケースがあります。MyClient はまだ実装のみを検出し、実装を検出しないため、このテストは失敗します。両方の実装には、ファイル内の一致するエントリが伴います。MyWorld"World""Hello World"MyHello.getGreetings()MyDummyMyWorldMETA-INF/services/my.runtime.MyFactoryInterface

現在、次のコードを使用して実装をロードしています。

の 2 番目の引数として ClassLoader を提供できることはわかっていますがServiceLoader.load、すべてのプラグイン プロジェクトを認識しているクラスローダーを取得する方法がわかりません。何か提案はありますか? または、ServiceLoader はこの問題に適したツールではありませんか?

0 投票する
3 に答える
1408 参照

java - タイプparm自体が汎用であるServiceLoader

これにより、コンパイラエラーが発生します:「add(Iterable<Foo<?>>)FooRepository型のメソッドは引数に適用できません(ServiceLoader<Foo>)」。

Iterable<Foo>をとして扱うことができることを望んIterable<Foo<?>>でいましたが、それだけでは機能しないようです。ServiceLoader.load(Foo.class)結果を私が供給できるものに変換するための最もクリーンな方法は何でしょうFooRepository.add()か?

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

php - 依存関係/サービス/構成をロードするための PHP でのエレガントな方法をお探しですか?

私は MVC PHP フレームワークを構築していますが、クラスに必要なものをロードするためのベスト プラクティスはどれでしょうか (他のクラスであろうと単純な構成であろうと)。

今日まで、私はシングルトン、レジストリ、そして最近では依存性注入コンテナーを使用してきました。多くの人が DI が進むべき道だと主張していますが、DI はコンポーネント間の結合の問題を別の場所に移しているように思えます。

シングルトンはグローバル状態を導入し、レジストリは密結合を導入し、DI は複雑さを導入します。私はまだ混乱しており、クラスを相互に配線する適切な方法を見つけることができません。

その間、私はカスタムソリューションを思いつきました。実際には解決策ではなく、コードからサービスのロードの実装を抽象化するだけです。

フレームワークのすべてのコンポーネントが他のサービスまたは構成をロードするために拡張する _load_service および _load_config メソッドを使用して抽象クラスを構築しました。

それらをロードする実装は、基本クラスの 1 つの場所だけに実装されるようになったため、少なくとも次のようなコード行をコンポーネントから削除しました。

また

データベースインスタンスが必要な場合は、これを行います

また、サービス ローダー、コンテナ、レジストリなどの実装は、以前使用していたコンテナ実装への呼び出しを変更するためにすべてのコードを検索することなく、単一のクラス メソッドで簡単に変更できます。

しかし、私が言ったように、クラスと構成をロードするためにどの方法を使用するかについては、よくわかりません。

あなたの意見は何ですか?

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

spring - ServiceFactoryBeanで作成されたBeanに適用されないSpringアスペクト

ServiceFactoryBeanで作成された(ServiceLoaderでロードされた)Beanにアスペクトを適用する際に問題が発生しました。

私の春のコンテキストは次のようになります。

私の側面は次のように定義されています。

何らかの理由で、アスペクトはmyAnotherBeanの呼び出しにのみ適用され、myBeanの呼び出しには適用されません。何か案は ?

0 投票する
3 に答える
28400 参照

java - インターフェイスの実装を見つけるためのServiceLoader

私はJavaServiceLoaderを使用して、次のような特定のインターフェースを実装するすべてのクラスを見つけようとしまし

残念ながら、Eclipseをデバッグモードで実行すると、ServiceLoaderはクラスを見つけられません。些細な点が欠けているような気がします...

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

java - プラグインを動的にロードする ServiceLoader または別のもの

読み通す

ServiceLoader について説明します。かなり単純です。この API を使用している人は、通常、新しい更新のためにクラスパスまたはアプリケーション パスをどのようにポーリングしていますか? ServiceLoader.reload メソッドを x 分ごとに呼び出しますか?

それとも、他のオープンソース API を使用していますか? または、フレームのような独自の ServiceLoader をロールバックしますか?

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

java - ServiceLoader を使用した事前および事後チェックによる動的ライブラリのロード

この質問は、アタッチ ライブラリの動的読み込みの問題を解決するための次のステップです。私はこのようなものを持っています:

AttachProvider の可用性の確認は次のようになります。

これをJDKのプライベートJREで実行すると、JDKにattach.dllはデフォルトのライブラリパスがあるため、すべて問題ありません。

問題

isAttachProviderAvailableこれは、最初の出現を削除した場合にのみうまく機能します。これは、使用可能になる前にインスタンス化しようとすると、後でロードされたAttachProviderときにインスタンス化できないためです。新しいライブラリ パスに従って更新されません。これを解決するには?インスタンス化せずに可用性を確認する方法、または更新する方法は?attach.dllServiceLoaderAttachProviderServiceLoader

0 投票する
3 に答える
844 参照

java - Java は Java で動的プラグインを実装します

このチュートリアルに従ってプラグインを動的にロードするアプリケーションを開発しました: http://solitarygeek.com/java/a-simple-pluggable-java-applicationですが、問題に遭遇しました。私のメイン アプリケーションには、静的メソッドを持つクラスがあります。プラグイン内からそのクラスにアクセスするにはどうすればよいですか? ロードされたプラグインからクラスにアクセスしようとすると、プラグインとアプリケーションが実行されているにもかかわらず、クラスが見つからないというエラーが表示されます。ありがとうございました