微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用 JavaPoet 处理 Java 注释 - 尝试为类型重新创建文件

我正在使用带有 JavaPoet 的 java 注释处理 API 来生成文件并使用 maven 来编译我的项目。

它按预期工作,结果文件Xrm.Tooling生成

但是,任何后续的 /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

解决方法

查看您的代码,很清楚,为什么会收到错误消息。每次完成 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;
}

应该避免该消息。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。