java - Java注释处理器不在生成的源中生成文件
问题描述
我正在编写一个简单的 java 注释处理器,它使用 JavaPoet 生成一个 java 类,然后将其写入文件管理器。
@AutoService(Processor.class)
public class ConfigProcessor extends AbstractProcessor {
private Types typeUtils;
private Elements elementUtils;
private Filer filer;
private Messager messager;
@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
super.init(processingEnv);
typeUtils = processingEnv.getTypeUtils();
elementUtils = processingEnv.getElementUtils();
filer = processingEnv.getFiler();
messager = processingEnv.getMessager();
}
@Override
public Set<String> getSupportedAnnotationTypes() {
Set<String> annotataions = new LinkedHashSet<String>();
annotataions.add(Config.class.getCanonicalName());
return annotataions;
}
@Override
public SourceVersion getSupportedSourceVersion() {
return SourceVersion.latestSupported();
}
@Override
public boolean process(Set<? extends TypeElement> annotations,
RoundEnvironment roundEnv) {
for (Element annotatedElement : roundEnv.getElementsAnnotatedWith(RemoteConfig.class)) {
TypeSpec configImpl = // generating
JavaFile javaFile = JavaFile.builder(elementUtils.getPackageOf(annotatedElement).getQualifiedName().toString(),
configImpl)
.build();
try {
javaFile.writeTo(filer);
} catch (IOException e) {
messager.printMessage(Diagnostic.Kind.ERROR,
"Failed to generate implementation",
annotatedElement);
return true;
}
}
return true;
}
}
此注释处理器将文件保存到target/classes/mypackage
而不是target/generated-sources/annotations/mypackage
我尝试将generatedSourcesDirectory
maven 编译器插件中的目录设置为生成的源目录,但它仍然在类文件夹中生成它。
如何将生成的类保存在 generated-sources 文件夹中?
解决方案
我遇到了完全相同的问题,解决方案看起来很奇怪。如果我仅通过设置属性来配置 maven-compiler-plugin 它总是直接在目标/类中生成源代码,但是当我在插件部分明确定义 maven-compiler-plugin 时,我的代码将在目标/生成源/注释中生成
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
</plugins>
</build>
这是一个工作正常的示例,当您删除插件时会出现同样的问题: https ://github.com/sockeqwe/annotationprocessing101
推荐阅读
- azure - Azure AppService 几次无法从 Azure 容器注册表中提取 docker 映像
- azure - Azure 永久将 IP 列入白名单
- python - Sphinx 不读取我的函数 docString?
- sql - Postgres查询根据状态条件将多行合并为一
- java - 使用java将重音字符转换为英文
- mongodb - 聚合 Mongo 中的两个 $Geonear
- php - 如何在 sh 文件中运行 PHP 脚本?
- django - 如何在 django 模板中减去 end_date - start_date
- c++ - 有效的 std::search 用于查找子序列的所有出现(避免无限循环)
- regex - sed - 捕获一个组并仅替换一个字符