【发布时间】:2015-08-12 14:18:59
【问题描述】:
一般问题
我有两个项目 A 和 B; B 依赖于 A。我想根据 A 中对象的注释在 B 中使用注释处理器生成一些代码。当我使用正确的处理器实现运行编译时,只拾取来自 B 的注释对象。
我知道默认情况下必须禁用扫描其他 JAR,因为您通常不希望对所有依赖项进行注释扫描。我也明白,由于编译器的魔力,我可能无法做我想做的事——我不太了解——但我希望不是这样。
具体情况
我的项目称为 DB 和 WEB。 WEB 显然依赖于 DB 的 JPA 访问;这是在 Maven 中配置的。由于许多架构选择,DB 必须保持一个单独的 JAR。 DB 不使用 Spring,除了一些被 WEB 消费的注解; WEB 使用 Spring MVC。
我正在尝试使用注释处理器为我的所有 JPA 实体生成 CrudRepository 接口。 @Repository 对象应该放在 WEB 项目的 repo 包中,因此它们可以在我的 WEB 应用程序中的任何位置与 @Autowired 一起使用。我正在执行扫描的注释是@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 项目中对于在那里定义的类运行良好。但是,我特别想要在依赖项目数据库中注释的访问类。我已经研究了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>
建议
我的另一个随机想法是在 WEB 中为 DB 项目运行 JavaCompiler 进程,但我将如何注入我的 Processor ?
【问题讨论】:
-
我不明白这个问题 - 注释处理器不工作还是......? :)
-
我希望在 WEB 项目上运行注释处理器时从 DB 项目 (= jar) 中提取注释。到目前为止,这还没有发生。
-
对。我有一个可以建议的解决方案。稍等片刻,我就可以写下来了。 :)
-
再问一个问题。你在用 Eclipse 吗?
-
我实际上在这个项目中使用 Netbeans,但我总是愿意改变
标签: java maven jpa annotation-processing javacompiler