【问题标题】:How to change Ant compiler to JDK 1.6如何将 Ant 编译器更改为 JDK 1.6
【发布时间】:2012-07-18 23:08:09
【问题描述】:

我需要编译我的源代码以兼容 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

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

【问题讨论】:

    标签: java ant


    【解决方案1】:

    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>
    

    【讨论】:

    • 谢谢。这可以覆盖编译器。你回答了我的问题。
    • 是的,它也帮助了我,我认为你使用的 fork="yes" 也很重要。
    【解决方案2】:

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

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

    不必指定可执行文件,除非您有真正特定的依赖项(例如,较新的企业版本而不是最新的免费版本)。

    示例:

    <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 编译器。

      【讨论】:

      • "您甚至不需要安装 Java 6 编译器。" ?
      • @BlessedGeek 是的,如果您有 Java 7、8 或(可能)更高版本,您应该能够使用 target 属性。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        说到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 属性终于可以按照上面的解释来设置了。请记住,这是资源密集型的,不推荐。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-22
          • 2012-01-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多