java - 如何用Ant编译注解处理器?

标签 java ant build annotations apt

这个问题看起来很明显,但是实现起来对我来说还是挺难的。

我的目标是编写 Ant 构建脚本编译一些需要由 Annotation Processor 生成的其他类的类。 我有一个自定义注释及其处理器实现(继承自 AbstractProcessor 类)。

据我所知,我需要:

  1. 编译注解处理器
  2. 对一些带注释的类运行编译器以生成新类。
  3. 编译需要生成类的类

代码(第 1 步和第 2 步):


<target name="compileAnnotationProcessor">        
    <javac destdir="${OUTPUT_DIR}"
           debug="true"
           failonerror="true"
           includeantruntime="false"
           classpath="${java.class.path}">
        <src>
            <pathelement path="${PROJECT_DIR}/tools/src"/>
        </src>

        <include name="/path/to/annotation/processor/package/**"/>
    </javac>
</target>

<target name="generateFilesWithAPT" depends="compileAnnotationProcessor">
    <javac destdir="${OUTPUT_DIR}"
           includeantruntime="false"
           listfiles="false"
           fork="true"
           debug="true"
           verbose="true">
        <src>
            <pathelement path="${PROJECT_DIR}/common/src/"/>
        </src>
        <include name="/path/to/files/to/compile/**"/>
        <classpath>
            <pathelement path="${OUTPUT_DIR}"/>
            <pathelement path="${java.class.path}"/>
        </classpath>

        <compilerarg line="-proc:only"/>
        <compilerarg line="-processorpath ${OUTPUT_DIR}/path/to/annotation/processor/package/annProcessorImplement"/>
    </javac>
</target>

实际上,第一个任务是执行良好并为 Annotation 处理器实现编译 .class 文件。它在第二个任务处停止。

Ant 说:请求未编译的注解处理,但未找到处理器。

我做错了什么? 也许我应该将注释处理器类放在 .jar 中?或者提供扩展名为 .class 的文件名作为 -processorpath 参数? 我尝试了几种选择,但没有任何帮助..


注意事项:

我正在使用 ant javac 任务而不是 apt,因为 documentation声称 apt 工具以及 com.sun.mirror API 已被弃用。 我也看过这个 question , 但没有关于如何以正确的方式编译处理器的信息。

我正在使用:

  • Java 1.6
  • Ant 1.8.2

最佳答案

我通常的做法是:

  • 将注解和注解处理器打包在自己的 jar 中
  • 通过该 jar 中的 META-INF/services 注册注释处理器

然后,无论您对注解有何依赖,注解处理器都会自动获取,无需任何额外配置。

关于java - 如何用Ant编译注解处理器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12855158/

相关文章:

java - 尝试使用 Twitter4J 在 java 中发布推文

java - Commons 编解码器中的 Base64.decode(privateKeyString, Base64.DEFAULT)

java - JUnit 没有给出关于 "errors"的信息

java - 实际参数不能通过方法调用转换来转换

ant - Ant 可以从属性文件中扩展环境变量吗?

Xamarin 构建时间非常慢

java - 收集可能为空的值

java - 在声明中初始化变量是否会使其在每次调用时重新创建?

c++ - 子目录的Makefile目录创建

build - 使用 msbuild 指定解决方案的项目文件