当前位置: 首页 > 知识库问答 >
问题:

Java注释处理器不在生成的源代码中生成文件

钱言
2023-03-14

我正在编写一个简单的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;
    }
}

这个注释处理器正在将文件保存到目标/类/我的包中,而不是目标/生成源/注释/我的包

我尝试将maven编译器插件中生成的SourcesDirectory目录设置为生成的sources目录,但它仍然在class文件夹中生成它。

如何将生成的类保存在生成的源文件夹中?

共有1个答案

储思聪
2023-03-14

我遇到了完全相同的问题,解决方案看起来很奇怪。如果我仅通过设置属性来配置maven-compiler-plugin,它总是直接在目标/类中生成源代码,但当我在plugins部分显式定义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

 类似资料:
  • 问题内容: 我正在使用Java 6注释处理API。我遵循了以下出色的教程,以创建用于在构建时显示消息的注释处理器: http://kerebus.com/2011/02/using-java-6-processors-in- eclipse/ 但是,就我而言,我有一个简单的类: 如您所见,使用元注释“ Retention”在运行时使JVM可以使用上述注释。我在另一个类的源代码中使用此“标准”注释来

  • 问题内容: 我需要以下工具: 方便地解析Java源代码并轻松访问给定的元素。 轻松生成源代码文件,轻松将数据结构转换为代码 有什么好的技巧,库,框架,工具吗?谢谢你的帮助。 问题答案: 从Java 6开始,编译器在JDK中包含一个API。通过它,您可以通过API 访问Java解析器的结果。JDK5以Mirror API 的形式提供了相同的功能。有一个很好的介绍性文章在这里。 我见过的最好的代码生成

  • 我正在尝试创建一个自定义注释,例如,确保字段或方法既是又是,如果字段或方法既不是又不是,则会生成编译时错误,如以下示例所示: 到目前为止,我已经完成了两个自定义注释接口: 和: 正如所暗示的,我不知道如何生成编译时错误。Processor的文档清楚地表明我不应该抛出异常, 如果处理器抛出未捕获的异常,该工具可能会停止其他活动注释处理器。 它接着描述了当提出错误条件时会发生什么,现在是如何提出错误条

  • 问题内容: 我正在尝试创建一个自定义批注,例如,以确保字段或方法为and ,并且如果该字段或​​方法不为and ,则将生成编译时错误,如以下示例所示: 到目前为止,我已经完成了两个自定义注释接口: 和: 如所示,我不知道如何生成编译时错误。Processor 的文档清楚地表明,我不应该抛出异常, 如果处理器抛出未捕获的异常,则该工具可能会停止其他活动的注释处理器。 它继续描述了引发错误条件时会发生

  • 我必须在扩展Composite的GWT客户机类上实例化一个由我的自定义注释处理器生成的类。生成的类也与此视图位于同一个包中。但是,当我运行超级开发模式(SDM)时,我得到以下错误。 常规的GWT编译不会产生错误。但是,我在SDM编译时得到了错误。 如何使GWT SDM编译此视图?