【问题标题】:Java 6 annotation processing configuration with Ant使用 Ant 的 Java 6 注释处理配置
【发布时间】:2011-04-08 07:52:40
【问题描述】:

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

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

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

【问题讨论】:

    标签: java ant build annotations apt


    【解决方案1】:

    这并不漂亮,但这是我所做的。 (来源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>
    

    【讨论】:

    • 我尝试了两种方法,但每次 ant 目标“在 0 秒内完成”,它实际上并没有生成文件,甚至没有打印我的调试语句。有趣的是,当我从命令行运行它时,我得到了 javac 错误 Annotation Processor mypackage.MyProcessor not found。我错过了什么吗?
    • 显然有问题。你用的是什么版本的javac r? mypackage.MyProcessor 是否扩展了已弃用的 1.5 (download.oracle.com/javase/1.5.0/docs/guide/apt/mirror/com/sun/…) 或当前的 1.6 (download-llnw.oracle.com/javase/6/docs/api/javax/annotation/…)?
    • 嘿,那是缺少的链接。我使用的是 javac v.1.6 和 jdk1.5 的镜像 API。我发现它到处都写着 apt 工具已被弃用,但没有发现镜像 API 也被弃用。尴尬了。无论如何,它仅在我编译处理器然后编译提供 -processor 和 -processorpath args 的其他源时才有效。如果我 jar 处理器并在类路径中使用它,它仍然不会做任何事情(我已经给出了 javax.annotation.processing.Processor 文件,该文件在 META-INF/services 中有 mypackage.MyProcessor)。
    • 我没有使用“服务”,而是创建了具有 META-INF/services/javax.annotation.processing.Processor 的 MyProcessor.jar,其中包含 mypackage.MyAnnotationProcessor。现在,当我在类路径中使用 MyProcessor.jar 编译源文件时,出现此错误:“错误:错误的服务配置文件,或构造处理器对象时引发的异常:javax.annotation.processing.Processor: Provider mypackage.MyAnnotationProcessor not found”跨度>
    • 原来你编译的包应该放到jar文件的根目录下。否则注释处理器将不会加载。以前我是在 jar 内的“classes”文件夹下复制我编译的包。
    【解决方案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>
    

    【讨论】:

      【解决方案3】:

      这是我在 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* 中
      • 你之前运行你的处理器 编译实际代码(使用或 没有生成的代码)。

      【讨论】:

        【解决方案4】:

        你可以看看annotation processing tool ,它会自动编译生成的源文件

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

        您可以将 apt 与 the apt ant task 结合使用

        但是从 jdk6 开始,javac 工具提供了direct support for annotation processing,因此您应该能够使用the javac ant task,并将编译器属性指定为“javac1.6”

        【讨论】:

        • 我不是在寻找那个。我正在寻找 Ant 构建配置(在我的问题中写得很清楚)。
        猜你喜欢
        • 2010-12-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-10
        • 2011-04-14
        • 1970-01-01
        • 1970-01-01
        • 2017-10-26
        • 1970-01-01
        相关资源
        最近更新 更多