如何在Ant任务中更改Java JDK版本?

14

我需要将我的源代码编译成与JRE 1.6兼容的版本。但是,当我尝试将javac任务的编译器属性设置为javac1.6时,Ant仍会使用javac1.7编译我的代码。我还尝试将编译器版本设置为“modern”,但也没有成功。

<target name="compile-tests">
    <javac compiler="javac1.6" includeantruntime="false" srcdir="${test.dir}" destdir="${build.dir}" >
        <classpath refid="class.path" />
    </javac>
</target>

我的JAVA_HOME已设置为JDK 1.6:

echo $JAVA_HOME
/usr/lib/jvm/java-6-openjdk-amd64/

我的Ant版本是: Apache Ant(TM)版本1.8.2

根据这篇帖子,Ant使用自己的编译器。我该如何覆盖Ant的默认设置?

此外,根据这篇帖子和Ant文档,我可以设置全局build.compiler属性。我应该将该属性设置为什么,以及如何设置?

5个回答

42

javac任务中,尝试通过设置executable属性来指定Java编译器,示例如下:

<property name="JDK1.6.dir" location="/usr/lib/jvm/java-6-openjdk-amd64" />
<property name="javac1.6" location="${JDK1.6.dir}/bin/javac" />

<target name="compile-tests">
  <javac executable="${javac1.6}" 
      fork="yes"
      includeantruntime="false" 
      srcdir="${test.dir}"
      destdir="${build.dir}" >
    <classpath refid="class.path" />
  </javac>
</target>

1
谢谢。这个方法可以覆盖编译器。你回答了我的问题。 - user847352
1
是的,它也帮助了我,而且我认为你使用的fork="yes"也很重要。 - hrabinowitz

7
我认为更新一下这个问题的答案会很好,因为我最近遇到了与此相关的很多问题。我有一个特定的使用场景:我的电脑使用JRE1.8,但是我需要ant针对运行在服务器上的JRE1.7版本。对我来说,技巧是结合使用以下属性(参考文档):
  • srcdir:Java文件的位置。
  • destdir:存储类文件的位置。
  • includeantruntime:是否将Ant运行时库包含在类路径中。通常最好将其设置为false,以使脚本的行为不受其运行环境的影响
  • source:编译器接受的Java语言功能
  • target:为特定的JVM版本生成类文件(交叉编译)。
  • fork:是否使用JDK编译器外部执行javac。
  • compiler:要使用的编译器实现。

您不需要指定可执行文件,除非您具有非常特定的依赖关系(例如,更高版本的企业版而不是最新的免费版本)。

示例:

<javac srcdir="${source}"
       destdir="${java.output.dir}"
       includeantruntime="false"
       source="1.7"
       target="1.7"
       fork="yes"
       compiler="javac1.7">
</javac>

3

我认为Ant的compiler属性只是为了知道编译器支持哪些属性。在javac中,通常传递给编译器的属性或选项是target

你甚至不需要安装Java 6编译器。


2
你甚至不需要安装Java 6编译器。 - Blessed Geek
@BlessedGeek 是的,如果您使用Java 7、8或(可能)更高版本,应该可以使用target属性。 - madth3

1
使用Ant javac任务的"target"属性来定义您希望类文件兼容的Java版本(在您的情况下将其设置为"1.6")。有关更多详细信息,请参见任务文档

0

谈到Ant的基础知识,由于它需要JVM运行,因此只需识别JRE即可。但是,如果构建过程需要编译类,则将依赖于Java编译器,如果找不到编译器,则构建将失败。

可以设置Ant使用多个Java编译器之一,但是下面的解释将重点介绍Oracle的javac。以下是替代方案...

如果Ant用于执行的JRE位于JDK的子目录下,则会升级到JDK级别并识别所需资源。
如果设置了JAVA_HOME环境变量并指向一个JVM(不是JRE),则Ant将能够编译Java构件。
另外,根据Ant文档,可以在特定于操作系统的批处理文件中设置JAVACMD(例如Windows的antrc_pre.bat),该文件放置在您的主目录(而不是Ant的主目录)下,则它将识别JVM。请注意,JAVACMD应引用bin文件夹下Java.exe的完整路径,而不是JVM home。
另外,Ant命令行可以使用-l选项列出库列表。将tools.jar传递给-l选项即可满足要求。
最后,JavaC任务的fork属性可以如上所述进行设置。请记住,这会耗费大量资源,不建议使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接