Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

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

javac de Java 9 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 ?

about 4 years ago · Santiago Trujillo
2 answers
Answer question

0

No exactamente.

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

Definimos 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 la 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 . El motivo de esta adición se indica en la sección "Motivación":

javac proporciona dos opciones de línea de comandos, -source y -target , 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 con 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 -target . opciones Este es un problema de usabilidad a largo plazo, ya que los usuarios esperan que al usar estas opciones obtendrán archivos de clase que se pueden ejecutar 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 , de forma predeterminada, se compila con 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 la compilación cruzada correctamente. Esto incluiría la versión de API correcta para compilar y permitir la ejecución en una versión anterior. Dado que se olvidaba muy a menudo, se decidió agregar una opción de línea de comando que hizo todo lo necesario para realizar una compilación cruzada correcta.

Lecturas adicionales en la lista de correo y Oracle Docs . El error original fue archivado aquí . Tenga en cuenta que desde la integración de esta opción, las compilaciones de JDK vienen incluidas 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.

about 4 years ago · Santiago Trujillo Report

0

--release X es más que un simple acceso directo a -source X -target X porque -source y -target no son suficientes para compilar de forma segura a una versión anterior. También debe configurar un indicador -bootclasspath que debe corresponder a la versión anterior (y este indicador a menudo se olvida). Entonces, en Java 9 crearon un solo indicador --release que reemplaza a tres indicadores: -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.

Otra diferencia importante es que solo puede usar API públicas al compilar con --release :

 > javac --add-exports java.base/sun.invoke=ALL-UNNAMED --release 11 Main.java error: exporting a package from system module java.base is not allowed with --release 1 error

Si desea utilizar API internas, debe eliminar la opción --release :

 > javac --add-exports java.base/sun.invoke=ALL-UNNAMED Main.java

o

 > javac --add-exports java.base/sun.invoke=ALL-UNNAMED -source 11 -target 11 Main.java
about 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!