2012-08-14 29 views
6

Nuestra construcción ant se ejecuta utilizando Java 1.7.0 para JAVA_HOME. De esta forma, javac y todos los demás destinos dependientes de Java usan la Java correcta de forma predeterminada.Ejecutar tarea ant en diferentes jvm

Pero 1 objetivo ant de un proveedor externo no es compatible (o más bien tiene un error) con Java 1.7.0. Y a diferencia de, por ejemplo, javac o un junit bifurcado, este objetivo no admite parámetros para cambiar de jvm.

¿Es posible ejecutar un objetivo ant específico en un jvm diferente?

+0

¿Puede proporcionarnos algún fragmento de código? –

Respuesta

3

Puede usar la tarea ejecut para ejecutar el archivo de compilación con ese objetivo definido para ejecutarse como un parámetro. Podría estar ejecutándose en una JVM diferente ya que puede pasar la JVM a esa llamada de ejecutivo.

Tenga en cuenta que tendría que refactorizar el destino para confiar en los archivos para la comunicación en lugar de establecer propiedades. Como estaría en una JVM diferente, obviamente no puede confiar en la memoria.

17

Para hacer Jeanne Boyarsky's sugerencia de utilizar el hormigón tarea Ant exec, el siguiente ejemplo se envuelve la tarea exec en una macro para simplificar los objetivos de llamada con varias JVM. Observe que la JVM se establece utilizando la variable de entorno Ant JAVACMD.

Ejemplo Proyecto

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

salida

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

En Windows (después de cambiar la ruta de jdk), la ejecución de la hormiga anterior podría arrojar la excepción, "Error de ejecución: java.io.IOException: No se puede ejecutar el programa" ant ": CreateProcess error = 2, El sistema no puede encontrar el archivo especificado ". Para resolverlo, cambie la línea "" to . – Santhanam

3

Puede ejecutar un objetivo en una JVM diferente (lo hacemos todo el tiempo). Sólo tiene que utilizar tenedor:

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

Pero tengo la sensación de que está consciente de esto, así que ¿qué hay de ejecutar la tarea ANT externa tal como es, y el resto de ellos (digamos que usted tiene 3 más tareas javac) en la JVM que quieres Esto se puede lograr estableciendo un archivo de propiedades. Ver javac task

Es posible utilizar compiladores diferentes. Esto puede ser especificado por cualquiera de establecer la propiedad mundial build.compiler, lo que afectará a todas las tareas a lo largo de la acumulación

Así que esta propiedad afectará sus tareas 3 y ejecutarlos en la JVM que ha especificado (por ejemplo 1,7) y puede establecer el JAVA_HOME predeterminado en lo que necesite su tarea de biblioteca externa.

Cuestiones relacionadas