ServiceLoader
でロード可能なプラグインモジュールをビルドしたかったのです。これには、META-INF/services
ディレクトリにファイルを追加する必要があります。このファイルは、サービスインターフェイスの名前に基づいており、実装するクラスへの適格なパスが含まれています。その後、ServiceLoader.load()
を呼び出してこれらのサービスを読み込むことができます。ここでJARとGradleのMETA-INF/services
は一例です:
たちはorg.example.plugins.PluginService
と呼ばれるプラグインインターフェイスを提供したいと言います。次に、このサービスの実装をクラスorg.example.plugins.impl.ExamplePlugin
に提供します。
何らかのプラグインメカニズムが必要な場合は、実装が含まれているJARファイルを作成できます。このJARファイルには、ファイルMETA-INF/services/org.example.plugins.PluginService
も含まれている必要があります。このファイルには、実装を見つけることがServiceLoader
を有効にするには、1つのライン
org.example.plugins.impl.ExamplePlugin
が含まれている必要があります。そのJARファイルがビルド・パス内にある場合、あなたはServiceLoader
によって発見され、あまりにもすべてのプラグインにアクセスできるようになります
Iterator<PluginService> it = ServiceLoader.load(PluginService.class).iterator();
それイテレータを呼び出すことにより、プラグインを読み込むことができます。
Gradleには、デフォルトでMETA-INF
ディレクトリにファイルが含まれていないことがあります。結果のJARにそのようなファイルが含まれるようにする方法はありますか?
すでにmetaInf
のメソッドが見つかりました。Jar
です。しかし、自分で解決策を見つけ出すのに十分なことは分かりません。
本当ですか?私のためにうまく動作します。どこにこのファイルを置くのですか? 'build.gradle'の見た目はどうですか? – axtavt
メインソースフォルダ 'src/main/java'に' META-INF'ディレクトリがあります。ビルドスクリプトに特別なものは何もありません。それはほぼ標準的なもので、いくつかの追加の依存関係といくつかのカスタムリポジトリを含んでいます。 – pvorb