在ant javac中设置Java的目标版本

问题描述 投票:0回答:4

我需要使用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。

ant javac
4个回答
92
投票

使用“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),因为可能会包含对不存在方法的引用。


51
投票

应指定源和目标。我建议提供 ant 默认值,这样您就不需要为每个 javac 任务指定源/目标属性:

<property name="ant.build.javac.source" value="1.5"/>
<property name="ant.build.javac.target" value="1.5"/>

更多信息请参见Java交叉编译笔记


16
投票

在我使用的类文件中查找 java 的版本:

javap -verbose <classname>

在开始时宣布版本为

minor version: 0
major version: 49

对应Java 1.5


5
投票

您还可以设置

{{ant.build.javac.target=1.5}}
ant 属性来更新任务的默认目标版本。 请参阅 http://ant.apache.org/manual/javacprops.html#target

© www.soinside.com 2019 - 2024. All rights reserved.