2012-08-14 16 views
6

La nostra build ant viene eseguita utilizzando Java 1.7.0 per JAVA_HOME. In questo modo javac e tutti gli altri target dipendenti da Java utilizzano il Java corretto per impostazione predefinita.Esegui attività ant in jvm

Ma un obiettivo di una formica da un fornitore esterno non supporta (o piuttosto ha un bug) utilizzando Java 1.7.0. E a differenza, ad es. javac o junit biforcuta, questo target non supporta i parametri per passare a jvm.

È possibile eseguire un target di formica specifico in un jvm diverso?

+0

Potete fornire alcuni snippet di codice? –

risposta

3

È possibile utilizzare l'attività exec per eseguire il file di build con quella destinazione definita da eseguire come parametro. Potrebbe essere in esecuzione in una JVM diversa poiché è possibile passare la JVM a quella chiamata exec.

Si noti che si dovrebbe rifattorizzare il target per fare affidamento sui file per la comunicazione anziché impostare le proprietà. Dato che sarebbe in una JVM diversa, ovviamente non può fare affidamento sulla memoria.

17

Per fare il suggerimento Jeanne Boyarsky's di utilizzare il calcestruzzo attività Ant exec, l'esempio seguente include l'attività exec in una macro per semplificare le chiamate alle destinazioni con varie JVM. Si noti che la JVM viene impostata utilizzando la variabile di ambiente Ant JAVACMD.

Esempio Progetto

<?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> 

uscita

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

Su Windows (dopo aver modificato il percorso di jdk), l'esecuzione della suddetta formica potrebbe generare l'eccezione "Esegui non riuscita: java.io.IOException: Impossibile eseguire il programma" ant ": Errore CreateProcess = 2, Il sistema non riesce a trovare il file specificato ". Per risolverlo cambia la riga "" a . – Santhanam

3

È possibile eseguire un bersaglio in una JVM diversa (lo facciamo tutto il tempo). Hai solo bisogno di utilizzare la forcella:

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

Ma ho la sensazione si è consapevoli di questo, così come circa l'esecuzione dell'attività ANT esterna come è, e resto di loro (supponiamo di avere altre 3 attività javac) in la JVM che desideri. Questo può essere ottenuto impostando un file di proprietà. Vedi javac task

È possibile utilizzare diversi compilatori. Questo può essere specificato sia impostando la proprietà globale build.compiler, che interesserà tutte le attività per tutta la build

Quindi questa proprietà possa influire sulla sua 3 compiti ed eseguirli nella JVM specificata (diciamo 1.7) e si può impostare il JAVA_HOME predefinito su qualunque sia l'attività della libreria esterna necessaria.

Problemi correlati