Java 9 javac
tiene una nueva bandera --release
:
> javac --help
...
--release <release>
Compile for a specific VM version. Supported targets: 6, 7, 8, 9
¿En qué se diferencia de las banderas -source
y -target
? ¿Es solo un atajo para -source X -target X
?
Respuestas:
No exactamente.
JEP 247: Compile for Old Platform Versions define esta nueva opción de línea de comandos
--release
:Entonces no, no es equivalente a
-source N -target N
. El motivo de esta adición se indica en la sección "Motivación":En resumen, especificar las opciones de origen y destino no es suficiente para la compilación cruzada. Debido a que
javac
, de forma predeterminada, se compila con la API de la plataforma más reciente, no se puede garantizar que se ejecuten en versiones anteriores. También debe especificar la-bootclasspath
opción correspondiente a la versión anterior para realizar una compilación cruzada correctamente. Esto incluiría la versión correcta de la API para compilar y permitir la ejecución en una versión anterior. Dado que a menudo se olvidaba, se decidió agregar una opción de línea de comando que hizo todo lo necesario para realizar una compilación cruzada correcta.Más información en la lista de correo y Oracle Docs . El error original se archivó aquí . Tenga en cuenta que desde la integración de esta opción, las compilaciones de JDK se incluyen con descripciones de las API de la plataforma de versiones anteriores, mencionadas en la sección "Riesgos y suposiciones". Eso significa que no necesita la versión anterior instalada en su máquina para que funcione la compilación cruzada.
fuente
--release
indicador, se inferiría del JDK usado para compilar, que generalmente difiere del JDK al que se dirige usando-source
y-target
. Esto puede morderlo en caso de que use clases / métodos introducidos en nunca JDK y luego en el que apunta. Esto es muy sutil en caso de que el compilador elija una sobrecarga de método que se agregó en una versión posterior sobre la anterior que pretendía, rompiendo así silenciosamente la compatibilidad binaria.--release X
es más que un acceso directo a-source X -target X
porque-source
y-target
no son suficientes para compilar de forma segura en una versión anterior. También necesita establecer una-bootclasspath
bandera que debe corresponder a la versión anterior (y esta bandera a menudo se olvida). Así, en Java 9 hicieron una sola--release
bandera que es un sustituto de tres banderas:-source
,-target
y-bootclasspath
.Entonces, este es un ejemplo de compilación en Java 1.7:
javac --release 7 <source files>
Tenga en cuenta que ni siquiera necesita tener JDK 7 instalado en su computadora. JDK 9 ya contiene la información necesaria para evitar que se vincule accidentalmente a símbolos que no existían en JDK 7.
fuente