2012-08-14 20 views
6

私たちのantビルドは、Java 1.7.0 for JAVA_HOMEを使用して実行されます。このようにjavacと他のすべてのJava依存ターゲットはデフォルトで正しいJavaを使用します。別のjvmでantタスクを実行

しかし、外部供給元の1つのantターゲットは、Java 1.7.0を使用している(またはバグがあります)。そして、例えば、 javacまたはforkされたjunitの場合、このターゲットはjvmを切り替えるパラメータをサポートしていません。

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

+0

いくつかのコードスニペットを提供できますか? –

答えて

3

execタスクを使用して、そのターゲットをパラメータとして実行するように定義されたビルドファイルを実行できます。 JVMをそのexec呼び出しに渡すことができるので、別のJVMで実行されている可能性があります。

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

17

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を実行すると、 "Execute failed:java.io.IOException:プログラム" ant "を実行できません:CreateProcess error = 2、システムが指定されたファイルを見つけることができません"これを解決するには、 ""行をに変更します。 – Santhanam

3

あなたは(私たちはそれをすべての時間を行う)異なるJVMでターゲットを実行することができます。で(あなたが3つの以上のjavacタスクを持って言うことができます)

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

しかし、私はあなたがこのことを認識している感じるので、どのようにそれがあるとして、外部ANTタスクの実行について、およびそれらの残り:あなたはフォークを使用する必要があります必要なJVMこれは、プロパティファイルを設定することで実現できます。 javac task

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

このプロパティは3つのタスクに影響し、指定したJVM(1.7など)で実行し、デフォルトのJAVA_HOMEを外部ライブラリタスクに必要なものに設定できます。

関連する問題