問題タブ [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 - OSGi などで ServiceLoader を使用する場合
依存関係にアレルギーがある人として、組み込みの Java 6 http://java.sun.com/javase/6/docs/api/java/util/ServiceLoader.htmlの代わりにいつ OSGi のようなものを使用しますかプラグイン jar をドロップするだけです)。
(参考までに、これはscalaアプリにあり、どんな提案も受け付けています。ServiceLoaderは私が望むものにかなり近いです)。
java - Java ServiceLoader を NetBeans 6.9 モジュールアプリケーションで動作させる方法
NetBeans モジュールアプリケーションで Java ServiceLoader を使用する際に問題があります。これが私がやろうとしていることです(Eclipseの通常のJavaアプリケーションで動作します):
インターフェイスを宣言するinterface.jarがあります。そして、このインターフェースのいくつかの実装を含む implementations.jar があり、すべて spi/META-INF/services/my.package.name.MyInterface ファイルで指定されています (このファイルは implementations.jar にあります)。
クラス ImplementationHandler (さらに別の handler.jar 内) もあり、これにはすべての実装をロードする次のメソッドがあります。
このコードは、Eclipse の通常のアプリケーション (foundImplementations.size() > 0) のすべての実装を返します。
ただし、NetBeans では、何も見つかりません (foundImplementations.size() == 0)。
詳細:
NetBeans モジュール アプリケーションのソース (オープン ソース、私が作成したものではありません) があり、これを MyInterface 実装のいくつかを使用して拡張する必要があります。interface.jar、implementations.jar、および handler.jar は Eclipse で作成され、別のアプリケーションの一部です。
NetBeans で、新しい実装を使用する必要があるモジュールを開き、3 つの jar ファイルをすべて外部ライブラリとして追加しました (NetBeans はそれらを ext フォルダーにコピーしましたが、これは望ましくありませんが、何もできません。別の myext フォルダーに入れたいと思うかもしれませんが、それはまた別の話です)。次に、すべてを再構築し、実装の 1 つを使用しようとしましたが、見つかりませんでした... 実装を取得するコードは、ImplementationHandler クラスにあり、次のようになります。
「MyInterface クラスが見つかりません: myImplementationName」という例外が発生しました...
NetBeans に関する私の知識は非常に限られているため、これを機能させるために他に何かする必要があるのではないかと考えていました。
java - 開発中のJavaServiceLoaderはどのように機能しますか?(JARを構築する前のユニットテスト?)
JavaのServiceLoaderでは、これらのエントリがJARファイル内に存在する必要があります。IDE内で、ユニットテストのために実行時にこれらのサービスエントリをプログラムで追加する方法はありますか?特にJARがまだビルドされていない場合。
java - ServiceLoaderの代替としてJavaで他に何を使用できますか?
ServiceLoaderのようなものを探していますが、SPIファイルに依存していません。ここでは、すべてのサービス実装を列挙してから、クラスローダーのパスに追加して見つける必要があります。
インターフェイスとサービスのいくつかの実装を備えたアプリケーションがあるとしましょう。どのフレームワークを使用できますか?これにより、アプリケーションに新しいJARを追加できます。これには、いくつかの新しい実装が含まれ、そのアプリケーション内のすべてのクラスローダーのクラスパスに自動的に追加できますか?ここでは、すべてのクラスローダーが非常に重要です。これがNetBeansモジュールアプリケーションの場合、NetBeansプラットフォームは奇妙な魔法を実行し、どのクラスローダーがどのスレッドでどのクラスパスで使用されているかがわからないためです。 、新しいJARを見つけるためにアプリケーションを再起動する必要がない場合でも、それは重要な要件ではありません。
OSGiについてはすでに聞いたことがありますが、これは大きすぎるようで、必要な機能は1%だけです。
提案をありがとう!
java - ServiceLoader構成ファイルをWebアプリに配置する場所
私はEclipseでWebアプリを書いています。
ServiceLoaderクラスを使用していくつかのプラグインをロードしようとしています。
ServiceLoaderのドキュメントには、META-INF/servicesにファイルを配置する必要があると書かれています。
ファイルをWebContent/META-INF / serviceフォルダーに配置しましたが、Eclipseを介してJUnitテストを実行すると、プラグインが見つかりません。
これはファイルの正しい場所ですか?
また、ファイルを検索しているフォルダーなど、ServiceLoaderからより多くのデバッグ情報を取得するにはどうすればよいですか?
grails - Grails で Java ServiceLoader クラスを使用するにはどうすればよいですか?
私は JDK のSPI メカニズムを他の多くのアプリケーションで問題なく使用してきました。ただし、Grails 内で動作させることはできないようです。
静的イニシャライザ内とクラス コンストラクタ内の両方から通常のコード (以下に示す) を試しましたが、どちらも機能しませんでした。
イテレータは、実際には実装クラスを反復処理しません。
私も試しました:
現在のクラスのクラスローダーを使用する必要がありますが、それも機能しません。
実装クラスをロードするために使用する必要がある他のメカニズムはありますか?
java - Java、特定のインターフェースを実装する URLClassLoader で使用可能なすべてのクラスを取得します
実行時にユーザー指定のテキスト トランスレータをロードするコマンド ライン アプリに取り組んでいます (コマンド ライン引数を介して提供されるクラス ファイル/jar へのパス)。基本的に、私はその引数を取得し、それを使用して URLClassLoader を作成しています。次に、Transable インターフェースを実装する URLClassloader で使用できるすべてのクラスを見つける必要があります。
現時点では、このコマンド ライン引数がクラス ファイルを含むディレクトリであることのみを許可しています。ソリューションをかなりシンプルにします (以下のコード)。しかし、正直なところ、jarファイル、jarファイルのディレクトリなどで故障するため、このソリューションは好きではありません...また、loadClassにはパッケージを含む完全な名前が必要であるため、定義されたパッケージを持つクラスでは明らかに故障します。誰でもより良い方法がありますか?
java - Androidでサービスローダーを使用する
私はJavaとAndroidの開発に非常に慣れていないため、muninのように統計と情報を収集するアプリケーションから始めようとしています。アプリケーションに「プラグイン」をロードできるようにしようとしています。これらのプラグインは既にアプリケーションに含まれていますが、すべてを個別に呼び出す必要はなく、反復処理できるようにしたいと考えています。serviceloader を使用しようとしましたが、META-INF/services を APK に入れることができませんでした。Androidでserviceloaderを使用できるかどうか疑問に思っていますありがとう
編集:java.util.ServiceLoaderについて質問していますが、そうすべきだと思いますが、サービスフォルダーをMETA-INFに取得する方法がわかりませんAPK
java - 複数のクラスローダーを備えたJavaServiceLoader
複数のClassLoaderがある環境でServiceLoaderを使用するためのベストプラクティスは何ですか?ドキュメントでは、初期化時に単一のサービスインスタンスを作成して保存することを推奨しています。
これにより、現在のコンテキストクラスローダーを使用してServiceLoaderが初期化されます。ここで、このスニペットがWebコンテナの共有クラスローダーを使用してロードされたクラスに含まれており、複数のWebアプリケーションが独自のサービス実装を定義したいとします。これらは上記のコードでは検出されません。ローダーが最初のwebappsコンテキストクラスローダーを使用して初期化され、他のユーザーに間違った実装を提供する可能性さえあります。
毎回サービスファイルを列挙して解析する必要があるため、常に新しいServiceLoaderを作成することはパフォーマンスの面で無駄に思えます。編集:これは、JavaのXPath実装に関するこの回答に示されているように、パフォーマンスの大きな問題になる可能性もあります。
他のライブラリはこれをどのように処理しますか?クラスローダーごとに実装をキャッシュしますか、毎回構成を再解析しますか、それとも単にこの問題を無視して1つのクラスローダーでのみ機能しますか?
java - EclipseJUnit4RunnerがMETA-INF/servicesファイルを取得しないのはなぜですか
MavenとEclipseを使用して(M2Eを使用して)、java.util.ServiceLoaderに依存していくつかのファクトリクラスを動的にロードするプロジェクトをビルドしています。Mavenで実行すると正常に動作しますが、組み込みのEclipse JUnit4 Runnerを使用してテストを実行すると、サービスの取得に失敗し、テストが成功しません。
META-INF / servicesをJUnitビルドパスに手動で追加するために必要なことはありますか?src / main / resources / META-INF/servicesまたはsrc/main / java / META-INF/servicesのどちらでも機能させることができませんでした。M2Eがビルドパスを設定する方法に関連していますか?まったく新しいプロジェクトでテストを作成しましたが、それでも失敗しました。
失敗している基本的なコードは次のとおりです。
テストは次のようになります。
TestFactoryは次のように定義されます。
TestFactoryImplは次のように定義されます。
私はもともとhttp://weblogs.java.net/blog/kohsuke/archive/2009/03/my_project_of_t.htmlのMetaInfServicesジェネレーターを使用していましたが、それを削除して手動でファイルを作成したところ、まだ失敗していました。 Maven Surefireプラグインを使用して実行すると、Eclipseでも同じように成功します。