我需要编译我的源代码以与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使用自己的编译器。如何覆盖ant默认值? 另外,根据this post和ant文档,我可以设置全局build.compiler属性。我该怎样设置该属性,我该怎么做?
答案 0 :(得分:32)
在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 :(得分:5)
我认为Ant compiler
属性只是为了知道编译器支持哪些属性。在javac
中,传递给编译器的属性或选项是target
。
您甚至不需要安装Java 6编译器。
答案 2 :(得分:2)
我认为最好为这个问题添加一个更新的答案,因为我最近解决了与此问题有关的许多头痛问题。我的特定用例:我的计算机使用JRE1.8,但是我需要使用ant来针对服务器上运行的JRE1.7。对我来说,诀窍是结合使用以下属性(引用documentation):
除非您确实有特定的依赖项(例如,较新的企业版本而不是最新的免费版本),否则您不必指定可执行文件。
示例:
<javac srcdir="${source}"
destdir="${java.output.dir}"
includeantruntime="false"
source="1.7"
target="1.7"
fork="yes"
compiler="javac1.7">
</javac>
答案 3 :(得分:1)
使用Ant javac任务的“target”属性来定义您希望类文件兼容的Java版本(在您的情况下将其设置为“1.6”)。有关详细信息,请参阅task documentation。
答案 4 :(得分: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属性。请记住,这是资源密集型的,不推荐使用。