programar para jre jdk for developers descargar java javac java-9

para - ¿Qué es el indicador--release en el compilador de Java 9?



jre 11 download (2)

Java 9 de Java 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 -source ? ¿Es solo un atajo para -source X -target X ?


No exactamente.

JEP 247: Compilar para versiones anteriores de plataforma define esta nueva opción de línea de comandos, --release :

--release una nueva opción de línea de comandos, --release , que configura automáticamente el compilador para producir archivos de clase que se vincularán con una implementación de la versión de plataforma dada. Para las plataformas predefinidas en javac , --release N es equivalente a -source N -target N -bootclasspath <bootclasspath-from-N> . (énfasis mío)

Entonces no, no es equivalente a -source N -target N La razón de esta adición se indica en la sección "Motivación":

javac proporciona dos opciones de línea de comandos, -source y -source , que se pueden usar para seleccionar la versión del lenguaje Java aceptada por el compilador y la versión de los archivos de clase que produce, respectivamente. Sin embargo, de forma predeterminada, javac compila contra la versión más reciente de las API de la plataforma. Por lo tanto, el programa compilado puede usar accidentalmente API solo disponibles en la versión actual de la plataforma. Dichos programas no pueden ejecutarse en versiones anteriores de la plataforma, independientemente de los valores pasados ​​a -source y -source . opciones. Este es un punto problemático de usabilidad a largo plazo, ya que los usuarios esperan que al usar estas opciones obtendrán archivos de clase que pueden ejecutarse en la versión de plataforma especificada.

En resumen, especificar las opciones de origen y destino no es suficiente para la compilación cruzada. Debido a que javac , por defecto, compila contra las API de plataforma más recientes, no se puede garantizar que se ejecuten en versiones anteriores. También debe especificar la opción -bootclasspath correspondiente a la versión anterior para realizar una compilación cruzada correctamente. Esto incluiría la versión correcta de API para compilar y permitir la ejecución en una versión anterior. Como a menudo se olvidaba, se decidió agregar una opción de línea de comando que hacía todo lo necesario para realizar una compilación cruzada correcta.

Lecturas adicionales en la lista de correo y Oracle Docs . El error original se archivó here . Tenga en cuenta que desde la integración de esta opción, las compilaciones de JDK vienen con descripciones de las API de la plataforma de versiones anteriores, mencionadas en la sección "Riesgos y supuestos". Eso significa que no necesita la versión anterior instalada en su máquina para que funcione la compilación cruzada.


--release X es más que un acceso directo a -source X -target X porque -source y -source no son suficientes para compilar de forma segura una versión anterior. También debe establecer un indicador -bootclasspath que debe corresponder a la versión anterior (y este indicador a menudo se olvida). Entonces, en Java 9 --release un único indicador de --release , que es un reemplazo de tres indicadores: -source , -bootclasspath y -bootclasspath .

Entonces, este es un ejemplo de compilación a 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 con símbolos que no existían en JDK 7.