使用JavaPoet进行Java注释处理-尝试为类型重新创建文件



我使用java注释处理API和JavaPoet生成一个文件和maven来编译我的项目。

它按预期工作,生成的文件是在/target/generated-sources/annotations/sk/typek/generated/TestGeneratedClass.java下生成的。

但是,任何后续的mvn compile都会以Caused by: javax.annotation.processing.FilerException: Attempt to recreate a file for type sk.typek.generated.TestGeneratedClass失败。

我知道我可以在每次重新编译之前调用mvn clean(然后它再次工作(,但我不想这样做。我以前使用的其他注释处理库没有这个问题,所以他们以某种方式处理了它。

有没有办法";强制重写";如果生成的文件已经存在?或者,作为注释处理代码的一部分,是否可以删除旧的生成文件(如果存在(?

我寻找解决方案,但找不到任何有用的东西。

我的注释处理器看起来像这样:

package sk.typek.annotation;
import com.google.auto.service.AutoService;
import com.squareup.javapoet.JavaFile;
import com.squareup.javapoet.TypeSpec;
import javax.annotation.processing.*;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.Modifier;
import javax.lang.model.element.TypeElement;
import java.io.IOException;
import java.util.Collections;
import java.util.Set;
@SupportedAnnotationTypes("sk.typek.annotation.TestAnnotation")
@SupportedSourceVersion(SourceVersion.RELEASE_8)
@AutoService(Processor.class)
public class TestAnnotationProcessor extends AbstractProcessor {
private Filer filer;
@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
super.init(processingEnv);
this.filer = processingEnv.getFiler();
}
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnvironment) {
if (annotations.isEmpty()) {
return false;
}
System.out.println("Processing annotations: " + annotations);
try {
TypeSpec.Builder classBuilder = TypeSpec.classBuilder("TestGeneratedClass")
.addModifiers(Modifier.PUBLIC, Modifier.FINAL);
JavaFile javaFile = JavaFile.builder("sk.typek.generated", classBuilder.build())
.build();
System.out.println("Writing file TestAnnotation to package " + javaFile.packageName);
// tried this doesnt work
if (javaFile.toJavaFileObject().delete()) {
System.out.println("Deleted previously generated file");
}
javaFile.writeTo(filer);
} catch (IOException e) {
throw new DiffBuilderAnnotationProcessorException(e);
}
return true;
}
@Override
public Set<String> getSupportedAnnotationTypes() {
return Collections.singleton(TestAnnotation.class.getCanonicalName());
}
@Override
public SourceVersion getSupportedSourceVersion() {
return SourceVersion.latestSupported();
}
}

查看您的代码,它非常清楚,为什么会出现错误消息。每次mvn compile完成时,处理器都会创建一个文件,甚至处理器也不需要

如果有必要重新创建文件,您需要询问处理器。您可以通过向处理器请求要创建的元素列表来实现这一点:

roundEnv.getElementsAnnotatedWith(TestAnnotation.class))

这将返回一个用TestAnnotation注释的元素列表,这些元素自上次编译以来已更改/需要构建。在mvn clean之后,列表将包含所有元素。

将您的代码更改为:

@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnvironment) {
if (annotations.isEmpty()) {
return false;
}
System.out.println("Processing annotations: " + annotations);
for (Element element : roundEnv.getElementsAnnotatedWith(TestAnnotation.class)) {
try {
TypeSpec.Builder classBuilder = TypeSpec.classBuilder("TestGeneratedClass")
.addModifiers(Modifier.PUBLIC, Modifier.FINAL);
JavaFile javaFile = JavaFile.builder("sk.typek.generated", classBuilder.build())
.build();
System.out.println("Writing file TestAnnotation to package " + javaFile.packageName);
// tried this doesnt work
if (javaFile.toJavaFileObject().delete()) {
System.out.println("Deleted previously generated file");
}
javaFile.writeTo(filer);
} catch (IOException e) {
throw new DiffBuilderAnnotationProcessorException(e);
}
}
return true;
}

应避开该消息。

相关内容

  • 没有找到相关文章

最新更新