Java 標準の Service Locator パターン
今は Spring などの DI コンテナが使用されることが多いですが、Java 標準でも疎結合を実現するために、インターフェースに合致するクラスを見つけるサービスロケーターパターンを実装したサービスプロバイダーフレームワークがありました。META-INF/services/
にクラス名を記述したプロバイダ構成ファイルを配置します。現在でも、この仕組みを使用したライブラリがあります。
gradle での設定方法
こないだ、このファイル自分で書かなあかんの? との話があったので、確認したところ、Jenkins で有名な kohsuke さんが、やっぱり? META-INF/services generator っていうのを作ってました。さすが。クラスに @MetaInfServices
アノテーションを付けることで、META-INF/services/
にファイルが自動生成されます。でも、コピペできる gradle の設定が見つかんなかったので、書き残しておきます。
build.gradle
plugins {
id 'java'
id 'eclipse'
// gradlew cleanEclipse eclipse で Eclipse ファクトリー・パス設定に追加される
// 生成先は bin/default/META-INF/services
id 'com.diffplug.eclipse.apt' version '3.43.0'
}
sourceCompatibility = 17
tasks.withType(JavaCompile) {options.encoding = 'UTF-8'}
repositories.mavenCentral()
dependencies {
// @MetaInfServices アノテーション
compileOnly 'org.kohsuke.metainf-services:metainf-services:1.11'
// アノテーション処理: gradlew build 用
// 生成先は build/classes/java/main/META-INF/services
annotationProcessor 'org.kohsuke.metainf-services:metainf-services:1.11'
}
Maven リポジトリ
最新版は下記を確認してください。
-
META INF/services Generator
https://mvnrepository.com/artifact/org.kohsuke.metainf-services/metainf-services -
Diffplug Eclipse APT Gradle Plugin
https://mvnrepository.com/artifact/com.diffplug.eclipse.apt/com.diffplug.eclipse.apt.gradle.plugin