我们的ant构建是使用Java 1.7.0为JAVA_HOME运行的。这样,javac和所有其他Java依赖目标默认使用正确的Java。
但是来自外部供应商的1个ant目标不支持(或者更确切地说是使用Java 1.7.0)。与...不同javac或forked junit,此目标不支持切换jvm的参数。
是否可以在不同的jvm中运行特定的蚂蚁目标?
答案 0 :(得分:17)
为了使Jeanne Boyarsky's建议使用具体的exec
Ant任务,以下示例将exec
任务包装在宏中,以简化使用各种JVM调用目标的过程。请注意,JVM是使用Ant环境变量JAVACMD
设置的。
<?xml version="1.0" encoding="UTF-8"?>
<project name="run-target-with-specified-java-version" default="test">
<macrodef name="exec-target">
<attribute name="antfile" default="${ant.file}" />
<attribute name="target" />
<attribute name="jvm" default="${java.home}/bin/java" />
<sequential>
<exec executable="ant">
<env key="JAVACMD" value="@{jvm}" />
<arg line='-f "@{antfile}"' />
<arg line="@{target}" />
</exec>
</sequential>
</macrodef>
<target name="echo-java-version">
<echo message="Java version: ${java.version}" />
</target>
<target name="test">
<exec-target target="echo-java-version" />
<property name="java1.6"
location="/usr/lib/jvm/jdk1.6/bin/java" />
<exec-target target="echo-java-version" jvm="${java1.6}" />
</target>
</project>
test:
[exec] Buildfile: /home/your/project/build.xml
[exec]
[exec] echo-java-version:
[exec] [echo] Java version: 1.7.0
[exec]
[exec] BUILD SUCCESSFUL
[exec] Total time: 0 seconds
[exec] Buildfile: /home/your/project/build.xml
[exec]
[exec] echo-java-version:
[exec] [echo] Java version: 1.6.0
[exec]
[exec] BUILD SUCCESSFUL
[exec] Total time: 0 seconds
BUILD SUCCESSFUL
Total time: 2 seconds
答案 1 :(得分:3)
您可以使用exec任务运行构建文件,并将该目标定义为作为参数运行。它可以在不同的JVM中运行,因为您可以将JVM传递给该exec调用。
请注意,您必须重构目标以依赖文件进行通信而不是设置属性。由于它将在不同的JVM中,它显然不能依赖于内存。
答案 2 :(得分:3)
您可以在不同的JVM中运行目标(我们会一直这样做)。你只需要使用fork:
<javac srcdir="${src}"
destdir="${build}"
fork="yes"
/>
但是我觉得你已经意识到了这一点,那么如何在你想要的JVM中运行外部ANT任务,以及其余部分(假设你还有3个javac任务)。这可以通过设置属性文件来实现。见javac task
可以使用不同的编译器。这可以通过设置全局build.compiler属性来指定,该属性将影响整个构建中的所有任务
因此,此属性将影响您的3个任务并在您指定的JVM(例如1.7)中运行它们,您可以将默认的JAVA_HOME设置为您的外部库任务所需的任何内容。