私がやろうとしているのは、特定のインターフェースの実装を探しているアプリケーションクラスをスキャンするいくつかのMavenプラグインを書くことです(いくつかの注釈を持つクラスかもしれません)いくつかのコードを生成します。私はプラグインをgenerate-sources段階で実行し、ソースコードをgenerated-sourcesディレクトリに書き込むことに成功しました。mavenプラグインのjavaクラスパスをスキャンする
問題は、いくつかの注釈を持つ特定のインタフェース実装/クラスのクラスパスをスキャンすることです。私は次のようにクラスをスキャンするReflectionsライブラリを使用しています :
残念ながらprivate Set<Class< ? extends MyInterface >> scan(final String packageName) {
final Reflections reflections = new Reflections(packageName);
return reflections.getSubTypesOf(MyInterface.class);
}
、このメソッドは空のセットを返します。
/home/pd5108/apache-maven-2.2.1/boot/classworlds-:私は(私はReflectionsを使用していた内の同じ)
org.apache.maven.plugin.AbstractMojo
を拡張するクラスで私のクラスパスを印刷するとき、私は次のような結果を得ます1.1.jar
リフレクションを使用して検索したいクラスは、依存関係のあるJARおよびプラグインが設定されているモジュールに存在します。クラスパスを見ると、クラスパス上でまだ利用できないmavenで定義されたこの時点(生成元フェーズ)の依存関係がまだ存在しているようです。おそらくそれらは次のフェーズで追加されます。本当?私が使用できる他のアプローチはありますか?ここで
は、クラスパスがプリントアウトされるかの方法である:
URL[] urls = ((URLClassLoader)sysClassLoader).getURLs();
for(int i=0; i< urls.length; i++) {
System.out.println(urls[i].getFile());
}
私は最後の手段として考えているオプションです。私はこのインターフェイスを実装するクラスがたくさんあり、それらのすべてがコード生成で考慮されているので、それらをすべて静的に入力しないようにしたいと思います。また、これらのクラスは頻繁に追加/削除されます。 –
"implements X"用のgrep all javaファイルのようなことをしたシェルスクリプトをいつでも持っていて、クラス名を解析してそれらのプロパティファイルを構築できます。次に、あなたのプラグインがそのプロパティファイルを使用して、どのクラスが余分なコードを生成するのかを知ることができます。あなたがUNIX上でなければ、私が想定しているJavaでgrepをエミュレートできますが、それはずっと遅くなります。 – Michael