問題タブ [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.
java - Javaでサービスプロバイダーをオーバーライドする方法
これは例による一般的な質問です。私は xstream と woodstox を使用しています。woodstox には、com.ctc.wstx.stax.WstxOutputFactory を登録する woodstox jar に javax.xml.stream.XMLOutputFactory のサービス プロバイダーが付属しています。独自の javax.xml.stream.XMLOutputFactory を提供したいのですが、まだクラスパスに woodstox jar があります。システム プロパティ javax.xml.stream.XMLOutputFactory を使用して独自のものを提供できることはわかっていますが、開発運用チームから面倒を取り除き、jar または戦争の META にあるサービス ファイルを使用してそれを実行しようとしています。 -INF/services フォルダー。javax.xml.stream.FactoryFinder のコードを調べて、自分の META-INF/services/javax.xml.stream.XMLOutputFactory ファイルが FactoryFinder で使用されるファイルであることを確認するにはどうすればよいですか?
camel で xstream を使用していますが、ファクトリを XStreamDataFormat に注入する方法が見つかりませんでした。
java - java.util.ServiceLoader がプロバイダー クラスをロードしない
HandlerRegistry から検索する基本的な SPI ベースのハンドラーのレジストリをまとめようとしています。ServiceLoader.load(Handler.class) を使用してプロバイダーを初期化し、リストを繰り返して遅延ロードすると、クラスのインスタンスが表示されません。これをできるだけ単純に保つと、私の HandlerRegistry クラスは次のようになります。
私は com.example.handler.Handler インターフェイス (簡単にするために今は空です) と、そのインターフェイスを実装する com.example.handler.handlers.DummyHandler クラスを持っています。META-INF/services/com.example.handler.Handler という名前の jar にファイルを作成しました。これには単一行が含まれています。
javadocによると。私の単体テストは、単純に lookup() メソッドを呼び出して、アイテムのハンドラーを検索することを確認します。もちろん、最終的には、これがこのアイテムの適切なハンドラーであるかどうかを確認するために何らかのチェックが必要になりますが、この時点では、私の DummyHandler クラスがレジストリによって読み込まれることさえ見ていません。ここで何か間違ったことをしていますか?
ありがとう!
java - One-Jar で Java ServiveLocator を使用する方法
One-Jar ツールを使用して、アプリケーションを 1 つの jar にパッケージ化しています。
http://one-jar.sourceforge.net/
nike で動作しますが、別の jar に実装されている依存モジュールに実装されているサービスに問題があります。
モジュールは、標準の Java ServiceLoader メカニズムを使用してそのサービスを提供します。つまり、jar には、インスタンス化するサービス具体的なクラスを指定するファイル META-INF/services/package.name.ServiceProviderClass があります。
ただし、この jar が One-Jar によって作成されたアプリケーション「fat-jar」に埋め込まれている場合、そのサービスはサービス ローダー メカニズムによって検出されません。
それを機能させる方法はありますか?
乾杯、パオロ
java - Jetty の ServiceLoader の問題
実行時にプラグインをロードできる Web アプリケーションに取り組んでいます。OSGi がこれに対する洗練されたソリューションであることは承知していますが、GWT が使用されているため、OSGi への移行は見られません。
プラグインを実装するために、3 つの jar があります: アプリケーション、pluginAPI :
そして plugin.jar
plugin.jar と Web アプリケーションには、pluginapi.jar への依存関係があります。アプリケーションでは、各 jar ファイルを個別の URLClassloader でロードするため、個別にアンロードできます。
上記のコード スニペットは、アプリケーション サーバーの外部でコードを実行した場合にのみ、魔法のように機能します。Jetty を使用して netbeans で GWT をデバッグしており、アプリケーションは Tomcat にデプロイされています (どちらも同じ動作を示します)。アプリケーション サーバーでコードを実行するとすぐに、コードは ServiceLoader.java のこの時点で失敗します。
私の意見では、プラグインとインターフェースの両方が適切にロードされていることをデバッグが示しています。それ以外の場合、Class.forName は失敗します。繰り返しますが、これはアプリケーション サーバーがなければ実現しません。サービス情報は META-INF/services/xx.xx.pluginapi.NotificationPlugin にあります。
私の直感によると、エラーはアプリケーション サーバーが ClassLoaders を使用する方法と関係がありますが、私と Google は参照を見つけることができませんでした。この問題を克服する方法を知っている人はいますか?助けていただければ幸いです。
java - java.util.ServiceLoader はサービスの単一インスタンスのみをロードしますか?
ServiceLoader.load()
ロードされたサービスの複数のインスタンスを作成するのに役立つかどうかを尋ねたいですか?
私はいくつかのテストを行ってきましたが、一度にサービスのインスタンスを 1 つしかロードできないようです。複数のインスタンスを持つことが可能である場合、誰かがこれを達成する方法を説明できますか?