2012-08-14 18 views
6

我们的ant构建是使用Java 1.7.0 for JAVA_HOME运行的。通过这种方式,javac和所有其他Java依赖目标默认使用正确的Java。在不同的jvm中运行ant任务

但是来自外部供应商的1个ant目标不支持(或者更确切地说是一个bug)使用Java 1.7.0。而且不像javac或者分叉的junit,这个目标不支持切换jvm的参数。

是否有可能在不同的jvm中运行特定的蚂蚁目标?

+0

你能提供一些代码片段吗? – 2012-08-15 04:18:36

回答

3

您可以使用exec任务运行构建文件,该目标定义为作为参数运行。它可以运行在不同的JVM上,因为您可以将JVM传递给该exec调用。

请注意,您必须重构目标才能依赖文件进行通信而不是设置属性。由于它将在不同的JVM中,所以它显然不能依赖内存。

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

在Windows上(更改jdk的路径之后),执行上面的ant可能会抛出异常,“执行失败:java.io.IOException:无法运行程序”ant“:CreateProcess error = 2,系统找不到指定的文件”。为了解决它,将“”行更改为。 – Santhanam 2015-10-29 14:02:13

3

您可以在不同的JVM(我们做这一切的时候)运行的目标。你只需要使用fork:

<javac srcdir="${src}" 
     destdir="${build}" 
     fork="yes" 
    /> 

但我感到大家都知道这一点,所以怎么样运行外部Ant任务,因为它是和他们的休息(可以说你有3个以上的javac任务)中你想要的JVM。这可以通过设置属性文件来实现。请参阅javac task

可以使用不同的编译器。这可以通过指定了设置全局build.compiler财产,这将影响到所有任务,在整个构建

所以这个属性会影响你的3个任务,并在JVM指定运行它们(比如说1.7),你可以将默认的JAVA_HOME设置为任何外部库任务需要的内容。