でロードできるプラグインモジュールを作成したかったのServiceLoader
です。META-INF/services
これには、サービスインターフェイスにちなんで名付けられ、それを実装するクラスへの修飾パスを含むファイルをディレクトリに追加する必要があります。次に、を呼び出してこれらのサービスをロードできますServiceLoader.load()
。
次に例を示します。
と呼ばれるプラグインインターフェースを提供したいとしますorg.example.plugins.PluginService
。次に、このサービスの実装をクラスで提供しますorg.example.plugins.impl.ExamplePlugin
。
ある種のプラグインメカニズムが必要な場合は、実装を含むJARファイルを作成できます。このJARファイルには、ファイルも含まれている必要がありますMETA-INF/services/org.example.plugins.PluginService
。このファイルには1行が含まれている必要があります
org.example.plugins.impl.ExamplePlugin
ServiceLoader
が実装を見つけられるようにします。そのJARファイルがビルドパスにある場合は、を呼び出すことでプラグインをロードできます
Iterator<PluginService> it = ServiceLoader.load(PluginService.class).iterator();
そのイテレータは、によって検出されたすべてのプラグインにもアクセスできるようにしますServiceLoader
。
META-INF
何らかの理由で、Gradleはデフォルトでディレクトリにファイルを含めません。結果のJARにそのようなファイルを含める方法はありますか?
私はすでにmetaInf
クラスでメソッドを見つけましたJar
。しかし、私は自分で解決策を見つけるのに十分なグルーヴィーを知りません。