注釈プロセッサのinit(ProcessingEnvironment)
メソッド内からのServiceLoader
の使用は可能ですか?注釈プロセッサ内でのServiceLoaderの使用
interface Service {}
class AnnotationProcessor extends AbstractProcessor {
public static void main(String[] args) {
ServiceLoader<Service> loader = ServiceLoader.load(Service.class);
System.out.println("Found Services:");
for (Service service : loader) {
System.out.println(service);
}
}
@Override
public synchronized void init(ProcessingEnvironment env) {
super.init(env);
ServiceLoader<Service> loader = ServiceLoader.load(Service.class);
System.out.println("Found Services:");
for (Service service : loader) {
System.out.println(service);
}
}
...
}
メインメソッドを実行すると、META-INF/servicesファイルで指定したサービスが生成されます。ただし、init(ProcessingEnvironment)
メソッドが別のプロジェクトのビルドの一部として呼び出された場合、そのサービスはリストされません。
これを行う方法はありますか?
あなたはもう少しあなたのセットアップについて説明することはできますか?どのようなプロジェクトがありますか?あなたのサービスはどこに定義されていますか?短い答え、はい、それは可能でなければなりません。しかし、META-INF/servicesファイルがあなたのクラスパス上にない理由を理解する必要があります。メインメソッドを実行するときのクラスパスは何ですか? – jbunting
私はMavenを使ってプロジェクト間のすべての依存関係を処理していますので、クラスパスはちょっと魔法です。私はそれを掘り下げ、私はより良い答えを考え出すことができるかどうかを見ます。 – bnorm
何か興味深いと思ったことは、注釈プロセッサーからプロセッサー・サービス(注釈プロセッサーのように)をロードしたときに空のリストも得られたことです。私は注釈プロセッサーにいるので、クラスパスが正しくセットアップされていることがわかります! – bnorm