8

Ant ビルドは、JAVA_HOME に Java 1.7.0 を使用して実行されます。このように、javac および他のすべての Java 依存ターゲットは、デフォルトで正しい Java を使用します。

しかし、外部サプライヤからの 1 つの ant ターゲットは、Java 1.7.0 の使用をサポートしていません (またはバグがあります)。また、javac やフォークされた junit などとは異なり、このターゲットは jvm を切り替えるパラメータをサポートしていません。

別のjvmで特定のantターゲットを実行することは可能ですか?

4

3 に答える 3

19

Ant タスクの使用に関するJeanne Boyarsky の提案を具体的にするために、次の例ではタスクをマクロでラップして、さまざまな JVM でのターゲットの呼び出しを簡素化しています。Ant 環境変数を使用して JVM が設定されていることに注意してください。execexecJAVACMD

サンプルプロジェクト

<?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をそのexec呼び出しに渡すことができるため、別のJVMで実行されている可能性があります。

プロパティを設定するのではなく、通信のためにファイルに依存するようにターゲットをリファクタリングする必要があることに注意してください。別の JVM にあるため、メモリに依存できないことは明らかです。

于 2012-08-15T02:28:46.700 に答える
3

別の JVM でターゲットを実行できます (常に実行しています)。フォークを使用するだけです:

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

しかし、あなたはこれを認識していると思いますので、外部 ANT タスクをそのまま実行し、残りのタスク (あと 3 つの javac タスクがあるとします) を必要な JVM で実行するのはどうでしょうか。これは、プロパティ ファイルを設定することで実現できます。javac タスクを参照

異なるコンパイラを使用することができます。これは、ビルド全体のすべてのタスクに影響するグローバル build.compiler プロパティを設定することで指定できます。

したがって、このプロパティは 3 つのタスクに影響を与え、指定した JVM (たとえば 1.7) でそれらを実行し、デフォルトの JAVA_HOME を外部ライブラリ タスクが必要とするものに設定できます。

于 2012-08-15T04:17:58.517 に答える