2012-05-19 13 views

Respuesta

21

Desde el javac docs:

-source Specifies the version of source code accepted.

-target Generate class files that target a specified version of the VM. Class files will run on the specified target and on later versions, but not on earlier versions of the VM.

En su ejemplo:

-source 1.5 and -target 1.6 

Esto se utiliza para asegurarse de que el código fuente es compatible con JDK 1.5, pero debe generar archivos de clase de uso en JDK 1.6 y posterior.

Completo por qué usted haría esto es otra cuestión.

+2

Tenga en cuenta que he encontrado que 'javac' no admite todas las combinaciones. También tengo un caso de uso. En Java 6 JAX-WS está integrado, por lo que quería tener una solución que funcione en Java 6 sin bibliotecas adicionales. Esa solución luego era necesaria para que unos pocos clientes fueran ejecutables en una Java 5 JVM (y JAX-WS incorporada en el lado) y la sintaxis '@ Override' cambió para que no fuera compilable inmediatamente por Java 5 javac. (Esto fue pre-maven, podría ser más fácil hacerlo hoy en día) –

+0

Véase también '-bootclasspath' como se describe más adelante en [esta respuesta] (http://stackoverflow.com/a/10663478/418556). –

+1

@skaffman - * "La razón por la que harías esto es otra cosa ..." * - Java intenta interpretar los comentarios. Si los idiomas no están configurados correctamente, la compilación podría fallar debido a un carácter ilegal en los comentarios. A veces es más fácil decirle al compilador que deje de interpretar los comentarios y, por ejemplo, corrige el aviso de copyright en cientos de archivos. – jww

10

El -source indica el nivel de cumplimiento que tiene su código fuente: ¿está utilizando Anotaciones? Entonces necesitaría al menos 1.5; está usando @override en las implementaciones de interfaz, lo que se necesita 1.6 etc

El -target especifica qué versión de Java que desea ser capaz de ejecutar sus clases en. Puede usar un compilador Java SE 7 y compilar para ejecutar en Java SE 1.5.

7

Esto es principalmente útil para producir un archivo jar que funcione con una versión anterior de Java. Creo que, hasta ahora, todos los JDK también pueden ejecutar versiones anteriores, por lo que no existe un motivo real para tener un objetivo más grande que la fuente.

Sin embargo, tiene sentido establecer target a, p. Ej. 1.6 cuando se usa un 1.7 JDK.

no estoy seguro, pero creo que podría funcionar en algunas situaciones para compilar un código java 1.7 utilizando un compilador 1,7 a un frasco de 1,6, por ejemplo expresiones tales como

ArrayList<Integer> foo = new ArrayList<>(); 

que sólo son válidos en la versión de origen 1.7+ debe compilarse a un código de bytes compatible de 1.6. Pero no he verificado si el compilador realmente hará esto. Desafortunadamente, esto no parece implementarse en la práctica.

+2

Si bien es una buena teoría, en realidad no hará esto en la práctica. Si prueba con la fuente 1.7 y el objetivo 1.6, obtendrá este error: "la versión de origen 1.7 requiere la versión de destino 1.7" – Tomas

+4

Encontré lo que @Tomas dice que es cierto. ¿Qué es irritante, ya que parece ser la combinación más útil? Le impide escribir bibliotecas en el nivel de fuente 1.7 que podrían vincularse en proyectos de 1.6. ¿Hay alguna solución para esto en absoluto? – Matthias

+0

@Matthias No hay problema en vincular bibliotecas de diferentes versiones de archivos de clase. La única razón para usar '-target 1.6' es si la JVM que ejecuta el código es 1.6. – Nayuki

Cuestiones relacionadas