这个问题看起来很明显,但是实现起来对我来说还是挺难的。
我的目标是编写 Ant 构建脚本 来编译一些需要由 Annotation Processor 生成的其他类的类。
我有一个自定义注释及其处理器实现(继承自 AbstractProcessor
类)。
据我所知,我需要:
- 编译注解处理器
- 对一些带注释的类运行编译器以生成新类。
- 编译需要生成类的类
代码(第 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/