我需要使用ant(1.7.0)编译一个jar文件以在特定版本的Java(1.5)下运行。我的机器上目前有 Java 1.6。我尝试过设置:
<target name="compile">
<javac compiler="javac1.5" target="1.5" srcdir=.../>
</target>
我也删除了
<property name="build.compiler" value="modern"/>
并且没有属性文件。我在 Linux/SUSE 上运行 Java 1.6
还有一种简单的方法可以确定 jar 文件中需要哪个版本的 Java。
使用“target”属性并删除“compiler”属性。请参阅此处。所以它应该是这样的:
<target name="compile">
<javac target="1.5" srcdir=.../>
</target>
这里是直接使用
javac
命令来实现此目的的示例。此信息来自@kon psych 的链接。我知道,这并没有显示蚂蚁是如何做到这一点的 build.xml
但它仍然非常有帮助,我想将这些信息保留在网站上,以防有一天出现 URL 404。
以下示例使用 javac 编译将在 1.6 VM 上运行的代码。
% javac -source 1.6 -target 1.6 -bootclasspath jdk1.6.0/lib/rt.jar \
-extdirs "" OldCode.java
-source 1.6 选项指定使用 Java 编程语言的 1.6(或 6)版本来编译 OldCode.java。选项 -target 1.6 选项可确保生成的类文件与 1.6 VM 兼容。请注意,大多数情况下,-target 选项的值就是-source 选项的值;在此示例中,您可以省略 -target 选项。
您必须指定 -bootclasspath 选项来指定引导类(rt.jar 库)的正确版本。如果不是,编译器会生成警告:
% javac -source 1.6 OldCode.java
warning: [options] bootstrap class path not set in conjunction with -source 1.6
如果没有指定正确版本的引导类,编译器将使用旧的语言规则(在本例中,它将使用 Java 编程语言的 1.6 版本)与新的引导类相结合,这可能会产生类文件不适用于旧平台(在本例中为 Java SE 6),因为可能会包含对不存在方法的引用。
应指定源和目标。我建议提供 ant 默认值,这样您就不需要为每个 javac 任务指定源/目标属性:
<property name="ant.build.javac.source" value="1.5"/>
<property name="ant.build.javac.target" value="1.5"/>
更多信息请参见Java交叉编译笔记。
在我使用的类文件中查找 java 的版本:
javap -verbose <classname>
在开始时宣布版本为
minor version: 0
major version: 49
对应Java 1.5
您还可以设置
{{ant.build.javac.target=1.5}}
ant 属性来更新任务的默认目标版本。
请参阅 http://ant.apache.org/manual/javacprops.html#target