使用 Ant 的 Java 6 注释处理配置

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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 构建配置(在我的问题中写得很清楚)。

以上是关于使用 Ant 的 Java 6 注释处理配置的主要内容,如果未能解决你的问题,请参考以下文章

ant+jmeter安装配置

Ant 入门

ant安装教程java怎么使用ant打jar包ant配置环境

将速度配置为注释对 Eclipse 的处理器依赖

eclipse配置ant开发环境,一键部署项目

使用 Groovy、IntelliJ 和 Gradle 在项目中“重新运行 Spring Boot 配置注释处理器”