【发布时间】:2011-04-08 07:52:40
【问题描述】:
我有一个自定义注释,它是处理器和处理器工厂。如何配置我的 Ant 构建文件:
注释处理器应用于带注释的类,并在“gen”文件夹中生成源文件
生成的源文件(通过注释处理)可以被项目中的其他源文件使用。
【问题讨论】:
标签: java ant build annotations apt
我有一个自定义注释,它是处理器和处理器工厂。如何配置我的 Ant 构建文件:
注释处理器应用于带注释的类,并在“gen”文件夹中生成源文件
生成的源文件(通过注释处理)可以被项目中的其他源文件使用。
【问题讨论】:
标签: java ant build annotations apt
这并不漂亮,但这是我所做的。 (来源javac ant taskjavac man page)使用compilerarg属性可以传入javac ant任务不直接支持的注解处理相关参数。
<javac srcdir="${src}" destdir="${classes}" ... >
....
<compilerarg line="-processorpath ${processorpath}"/>
<compilerarg line="-processor ${processor}"/>
<compilerarg line="-s ${whereToPutGeneratedClassFiles}"/>
</javac>
我不使用APT tool,因为文档说明
请注意,Apt 工具似乎确实是 JDK 框架的不稳定部分,因此在未来的版本中可能会发生根本性的变化。特别是它可能在 JDK 6 中已过时,它可以将注释处理器作为 javac 的一部分运行。
如果你真的不关心编译器参数,你可以像这样 jar 注释处理器
<jar destfile="${annotationprocessorjar}" ... >
...
<service type="javax.annotation.processing.Processor" provider="${your.annotation.processor.fully.qualified.name}"/>
</jar>
那你就可以了
<javac ... make sure ${annotationprocessorjar} is in classpath>
</javac>
【讨论】:
由于一些关键位是无法解释的变量,我发现其他一些示例有点令人困惑。这是我最终得到的结果:
构建处理器 jar:
<target name="build-aux">
<mkdir dir="${build.dir}" />
<mkdir dir="${build.classes}" />
<javac destdir="${build.classes}" source="1.6" target="1.6">
<src path="${src.java}" />
<include name="com/acme/cli/Program.java" />
<include name="com/acme/cli/ProgramProcessor.java" />
</javac>
<jar jarfile="acme-aux.jar" update="true">
<manifest>
<attribute name="Main-Class" value="${main.class}" />
<attribute name="Implementation-Title" value="acme-aux" />
<attribute name="Implementation-Version" value="${version}" />
<attribute name="Implementation-Vendor" value="ACME, Inc" />
<attribute name="Built-By" value="${user.name}" />
<attribute name="Build-Date" value="${TODAY}" />
</manifest>
<fileset dir="${build.classes}">
<!-- the annotation -->
<include name="com/acme/cli/Program.class" />
<!-- the annotation processor -->
<include name="com/acme/cli/ProgramProcessor.class" />
</fileset>
<service type="javax.annotation.processing.Processor"
provider="com.acme.cli.ProgramProcessor" />
</jar>
</target>
然后编译代码并运行处理器:
<target name="compile" depends="generate,build-aux">
<mkdir dir="${build.dir}" />
<mkdir dir="${build.classes}" />
<javac destdir="${build.classes}" source="1.6" target="1.6">
<src path="${src.java}" />
<include name="com/acme/**/*.java" />
<!-- ensure that "acme-aux.jar" is in this classpath -->
<classpath refid="compile.class.path"/>
<!-- pass option to annotation processor -->
<compilerarg value="-Aacme.version=${version}" />
</javac>
</target>
【讨论】:
这是我在 eclipse/ant 中的做法:
<javac destdir="bin"
debug="true"
debuglevel="${debuglevel}"
compiler="javac1.6"
srcdir="${src}">
<include name="**/*.java"/> <!-- I just do it this way -->
<classpath refid="classpath_ref_id"/>
<compilerarg value="-processor" />
<compilerarg value="${processor}" />
<compilerarg value="-s" />
<compilerarg value="${gen_src_target}" />
</javac>
备注
【讨论】:
你可以看看annotation processing tool ,它会自动编译生成的源文件
//编辑// 回复您的评论:
您可以将 apt 与 the apt ant task 结合使用
但是从 jdk6 开始,javac 工具提供了direct support for annotation processing,因此您应该能够使用the javac ant task,并将编译器属性指定为“javac1.6”
【讨论】: