でロードできるプラグインモジュールを構築したいと思いました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
。
何らかの理由で、GradleはMETA-INF
デフォルトでディレクトリにファイルを含めません。結果のJARにそのようなファイルを含める方法はありますか?
metaInf
クラスのメソッドはすでに見つかりましたJar
。しかし、私は自分で解決策を見つけるのに十分なグルーヴィーさを知りません。
あなたは配置META-INF/services/org.example.plugins.PluginService
でsrc/main/java
、したがって、つまり、Mavenのディレクトリレイアウト規則に従ってフォルダリソースに配置する必要があり、それはリソースファイルです、が、それはソースではありません
src/main/resources/META-INF/services/org.example.plugins.PluginService
この場合、すべてがそのまま動作します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加