使用 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 注释处理配置的主要内容,如果未能解决你的问题,请参考以下文章