12

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

<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 </code> gives: <code>
/usr/lib/jvm/java-6-openjdk-amd64/

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

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

4

5 回答 5

40

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

<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>
于 2012-07-18T23:19:28.023 回答
5

我认为为这个问题添加一个更新的答案会很好,因为我最近处理了很多关于这个问题的头痛。我的具体用例:我的计算机使用 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>
于 2018-10-02T21:59:46.957 回答
4

我认为 Antcompiler属性只是为了知道编译器支持哪些属性。一般来说javac,传递给编译器的属性或选项是target.

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

于 2012-07-19T00:06:38.383 回答
1

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

于 2012-07-19T16:16:21.077 回答
0

谈到 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 home 的完整路径。

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

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

于 2015-11-18T15:57:27.313 回答