一般的な質問
私は 2 つのプロジェクト A と B を持っています。B は A に依存しています。A のオブジェクトの注釈に基づいて、注釈プロセッサを使用して B にコードを生成したいと考えています。正しいプロセッサ実装でコンパイルを実行すると、B の注釈付きオブジェクトのみが取得されます。
通常、すべての依存関係に対して注釈スキャンを実行したくないため、他の JAR のスキャンをデフォルトで無効にする必要があることを理解しています。また、コンパイラの魔法のせいでやりたいことを実行できない可能性があることも理解していますが、コンパイラの魔法についてはよくわかりませんが、そうではないことを願っています.
特定のケース
私のプロジェクトは DB と WEB と呼ばれています。WEB は明らかに、JPA アクセスを DB に依存しています。これは Maven で構成されます。アーキテクチャ上の選択肢が多いため、DB は別個の JAR のままにしておく必要があります。DB は、WEB によって消費されるいくつかの注釈を除いて、Spring を使用しません。WEBはSpring MVCを使用。
CrudRepository
アノテーション プロセッサを使用して、すべての JPA エンティティのインターフェイスを生成しようとしています。@Repository
オブジェクトは WEB プロジェクト内のパッケージに入るはずなのでrepo
、@Autowired
WEB アプリケーションのどこでも使用できます。スキャンを実行している注釈は ですが@javax.persistence.Entity
、カスタム注釈も試しましたが、同じ結果が得られました。
@SupportedAnnotationTypes("javax.persistence.Entity")
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class RepositoryFactory extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
for (Element e : roundEnv.getElementsAnnotatedWith(Entity.class)) {
if (e.getKind() != ElementKind.CLASS) {
continue;
}
// TODO: implement logic to skip manually implemented Repos
try {
String name = e.getSimpleName().toString();
TypeElement clazz = (TypeElement) e;
JavaFileObject f = processingEnv.getFiler().
createSourceFile("blagae.web.repo." + name + "Repo");
try (Writer w = f.openWriter()) {
PrintWriter pw = new PrintWriter(w);
pw.println("package blagae.web.repo;");
pw.println("import org.springframework.data.repository.CrudRepository;");
pw.printf("import %s;\n", clazz.toString());
pw.println("import org.springframework.stereotype.Repository;");
pw.println("@Repository");
pw.printf("public interface %sRepo extends CrudRepository<%s, Long> {}\n", name, name);
pw.flush();
}
} catch (IOException ex) {
Logger.getLogger(RepositoryFactory.class.getName()).log(Level.SEVERE, null, ex);
}
}
return false;
}
}
理想的には、次のような簡単な注釈について誰かに教えてもらいたいです。
@ComponentScan(basePackages = "blagae.db.*")
しかし、もちろん、どこかに文書化されている可能性があるため、私はそれを期待していません。回避策として、Spring の依存関係を db に追加してそこでクラスを生成することもできますが、それらは Spring MVC アプリでのみ目的を果たします。また、これを機能させるために必要な構成についても警戒しています。
アップデート
いくつかの追加情報: 私は maven-processor-plugin を使用しています。これは、そこに定義されているクラスの WEB プロジェクトでうまく機能することが確認されています。ただし、依存関係プロジェクト DB で注釈が付けられたクラスにアクセスすることを特に望んでいます。メソッドを調べましたAbstractProcessor::getSupportedOptions
が、そこで何ができるかは不明です。
Maven 設定:
<plugin>
<groupId>org.bsc.maven</groupId>
<artifactId>maven-processor-plugin</artifactId>
<version>2.2.4</version>
<configuration>
<processors>
<processor>blagae.utils.RepositoryFactory</processor>
</processors>
</configuration>
<executions>
<execution>
<id>process</id>
<goals>
<goal>process</goal>
</goals>
<phase>generate-sources</phase>
</execution>
</executions>
</plugin>
提案
私が持っていたもう1つのランダムな考えはJavaCompiler
、WEBでDBプロジェクトのプロセスを実行することでしたが、どのように注入しますProcessor
か?