8

我们的 ant 构建是使用 Java 1.7.0 for JAVA_HOME 运行的。这样 javac 和所有其他 Java 相关目标默认使用正确的 Java。

但是来自外部供应商的 1 个 ant 目标不支持(或者说存在错误)使用 Java 1.7.0。与 javac 或分叉的 junit 不同,此目标不支持切换 jvm 的参数。

是否可以在不同的 jvm 中运行特定的 ant 目标?

4

3 回答 3

19

为了使Jeanne Boyarsky使用execAnt 任务的建议具体化,以下示例将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
于 2012-08-15T04:15:06.853 回答
3

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

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

于 2012-08-15T02:28:46.700 回答
3

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

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

但我感觉你已经意识到了这一点,那么在你想要的 JVM 中运行外部 ANT 任务怎么样,其余的(假设你还有 3 个 javac 任务)。这可以通过设置属性文件来实现。见javac 任务

可以使用不同的编译器。这可以通过设置全局 build.compiler 属性来指定,这将影响整个构建过程中的所有任务

因此,此属性将影响您的 3 个任务并在您指定的 JVM(例如 1.7)中运行它们,您可以将默认 JAVA_HOME 设置为您的外部库任务需要的任何内容。

于 2012-08-15T04:17:58.517 回答