18

我有一个自定义注释,它是处理器和处理器工厂。如何配置我的 Ant 构建文件,以便:

  1. 注释处理器应用于带注释的类并在“gen”文件夹中生成源文件

  2. 生成的源文件(来自注释处理)可以被项目中的其他源文件使用。

4

4 回答 4

11

这不漂亮,但这是我所做的。(来源javac ant 任务 javac 手册页)使用 compilerarg 属性,我可以传入注释处理 javac ant 任务不直接支持的相关参数。

<javac srcdir="${src}" destdir="${classes}" ... > 
     ....
     <compilerarg line="-processorpath ${processorpath}"/>
     <compilerarg line="-processor ${processor}"/>
     <compilerarg line="-s ${whereToPutGeneratedClassFiles}"/>
</javac>

我不使用APT 工具,因为文档说明

请注意,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>
于 2010-09-05T01:21:42.027 回答
2

由于一些关键位是无法解释的变量,我发现其他一些示例有点令人困惑。这就是我最终得到的结果:

构建处理器 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>
于 2013-08-02T14:46:04.520 回答
1

以下是我在 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>

笔记

  • 处理器路径包含在 *classpath_ref_id*
  • 在编译实际代码(有或没有生成的代码)之前运行你的处理器。
于 2010-12-06T18:53:27.633 回答
0

你可以看看注解处理工具 ,它会自动编译生成的源文件

//编辑//回复您的评论:

您可以将 apt 与apt ant 任务结合使用

但是从 jdk6 开始,javac 工具提供了对注解处理的直接支持,因此您应该能够使用编译器属性指定为“javac1.6”的 javac ant 任务

于 2010-09-04T22:54:45.737 回答