2011-02-13 24 views
6

Me gustaría utilizar JDK 1.6 para una rama de un proyecto, mientras que otros siguen usando JDK 1.5. Los desarrolladores quieren cambiar ocasionalmente entre ellos.¿Puedo especificar la ruta JDK para compilar dentro de Ant build.xml?

Entonces, ¿cuál es la mejor forma de para decir Ant's javac que JDK usar? Mejor, me refiero a un robusto, transparente, de bajo mantenimiento, versionado junto con la fuente (Ant y JDK ciertamente no lo son, pero viven en lugares estándar).


La -en lugar de manera obvia mejor- que supongo sería exterior de Ant: seguir cambiando la variable de entorno JAVA_HOME. Sin embargo, esto requeriría que los desarrolladores cambiaran manualmente (otra cosa para recordar: propenso a errores), un cambio de todos los servidores de muchas versiones (más trabajo para mí ahora).

Buscando un poco sencilla javac atributo por ejemplo jdk-path, me di cuenta de varias lugar (gracias a la lectura para arriba en la red y en el SO):

  • compiler - justo lo suficiente, pero docs dice "moderna: .. javac1.5 y javac1.6 .. como alias ".. Para mí esto sugiere que no hará ninguna diferencia, ¿o sí?
  • source - parece solo acerca de la versión de JLS (aunque no% 100 desprende de los documentos relacionados anteriormente)
  • target - versión de código de bytes
  • bootclasspath - algunos tan respuestas mencionar esto, pero bastante poco claras y parece hacker
  • executable - ruta a javac, pero no a libs .. - parece la coincidencia más cercana, especificando implícitamente la ruta JDK? ACTUALIZACIÓN: confirmado por JB Nizet
  • fork - parece que voy a necesitar cierto aquí (de lo contrario, simplemente ignorará lo anterior sin error?). ACTUALIZACIÓN: ¿Cualquier implicancia de rendimiento vs. defecto? (Supongo que los tiempos de inicio de JVM son mejores en estos días, pero todavía)

Por lo tanto, parece que ninguno de estos ayudan en sí mismo .. es cualquier combinación de éstas equivale a establecer JAVA_HOME antes de ejecutar Ant?

que tienen algunos hacks en mente (por ejemplo, envolviendo ejecutable de hormigas en cada plataforma sólo para establecer que env var - bastante triste), pero realmente espero que me haya perdido algo :)

Respuesta

2

Usando el atributo ejecutable necesita para establecer el tenedor atributo a verdadero. Esto significa que la tarea javac ant iniciará un proceso externo para ejecutar javac.

Cuando ejecuta javac manualmente, no tiene que especificar ningún directorio lib específico de JDK: sabe dónde encontrar las bibliotecas del JDK del que forma parte. Yo diría que será lo mismo si lo lanzas a través de la tarea javac de ant (a menos que anules el compás de arranque).

+0

gracias, buen punto .. Aunque sabía ruta del JDK se infiere cuando se ejecuta independiente javac, documentos Ant están lejos de ser claro en este respeto ... ¿puedes confirmar que la combinación del ejecutable + tenedor es "equivalente a establecer JAVA_HOME antes de ejecutar Ant?" (actualice la respuesta por favor) +1 – inger

+0

¿fork = es realmente caro en Java6? – inger

1

La versión del JDK que se utiliza para compilar las clases no debería importar necesariamente. Puede haber diferencias en cómo un JDK en particular compila recursos, pero si la diferencia es solo entre v1.5 y v1.6, puede compilar el código para que sea compatible con Java 1.5 (o incluso 1.1) con un 1.6 JDK.

Puede controlar qué versión de JVM para compilar para utilizar el atributo target:

<javac srcdir="${src}" 
     destdir="${build}" 
     fork="true" 
     source="1.5" 
     target="1.6" /> 
+2

Pero esto no impide que las clases de 1.6 JDK (como NavigableMap, por ejemplo) sean utilizadas inadvertidamente por los desarrolladores. Este error solo se detectará en el tiempo de ejecución cuando se ejecute en JDK 1.5 ... ¡ay! Una forma de resolver esto es usar bootclasspath. O simplemente use JDK 1.5 para compilar. –

Cuestiones relacionadas