如何将Ant编译器更改为JDK 1.6

我需要编译我的源代码以与jre 1.6兼容。 但是,当我尝试将javac任务的编译器属性设置为javac1.6时,ant仍将使用javac1.7编译我的代码。 我也尝试将编译器版本设置为“现代”,但没有帮助。

     

我的JAVA_HOME设置为JDK 1.6:

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

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

根据这篇文章 ,ant使用自己的编译器。 如何覆盖ant默认值? 另外,根据这篇文章和ant文档,我可以设置全局build.compiler属性。 我该怎么设置该属性,我该怎么做?

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

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

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

        

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

谈论Ant的基础知识,因为它需要运行JVM,它就足以为此目的识别JRE。 但是,如果构建过程需要编译类,那么它将依赖于Java编译器,如果它没有找到,那么构建将失败。

可以将Ant设置为使用几个Java编译器中的一个,但是我将重点关注Oracle的javac以获得下面的解释。 以下是替代方案……

1)如果Ant认可其执行的JRE是JDK下的子目录,它将提升到JDK级别并识别所需的资源。

2)如果JAVA_HOME环境变量设置为指向JVM(而不是JRE),那么ant将能够编译Java工件

3)或者,根据Ant文档,JAVACMD可以设置在特定于操作系统(Windows的antrc_pre.bat)的批处理文件中,放在主目录下(而不是Ant的目录),然后它将识别JVM。 请注意JAVACMD应该引用bin文件夹下的Java.exe的完整路径而不是JVM主目录。

4)或者,Ant命令行可以使用-l选项获取库列表。 将tools.jar传递给-l选项就足够了。

5)最后可以如上所述设置JavaC任务的fork属性。 请记住,这是资源密集型,不推荐使用。

我认为为这个问题添加更新的答案会很好,因为我最近处理了围绕同一问题的许多令人头疼的问题。 我的具体用例:我的计算机使用JRE1.8,但我需要ant来定位服务器上运行的JRE1.7。 我的诀窍是组合使用以下属性(引用文档 ):

  • srcdir :java文件的位置。
  • destdir :存储类文件的位置。
  • includeantruntime :是否在类路径中包含Ant运行时库。 通常最好将其设置为false,以便脚本的行为对运行它的环境不敏感。
  • source :编译器接受的Java语言特性
  • target :为特定JVM版本生成类文件(交叉编译)。
  • fork :是否在外部使用JDK编译器执行javac。
  • 编译器 :要使用的编译器实现。

除非您确实具有特定的依赖关系(例如,最新的企业版本而不是最新的免费版本),否则您不必指定可执行文件。

例: