¿Cuál es la relación / diferencia entre sourceCompatibility
y targetCompatibility
? ¿Qué sucede cuando se configuran con valores diferentes?
Según la documentación de Gradle :
sourceCompatibility
es "Compatibilidad con la versión de Java que se utilizará al compilar la fuente de Java"
targetCompatibility
es "Versión Java para generar clases".
Entiendo que targetCompatibility
generará un bytecode de Java que sea compatible con una versión específica de Java, ¿es esto un subconjunto de la funcionalidad de sourceCompatibility
?
Tenga cuidado cuando los use; Hemos sido mordidos por personas que hacen suposiciones.
El hecho de que use sourceCompability (o targetCompatibility) de 1.5 no significa que siempre pueda compilar su código con JDK 1.6 y esperar que funcione bajo JDK 1.5. El problema son las bibliotecas disponibles.
Si su código llama a algún método que solo está disponible en JDK 1.6, aún se compilará con las diversas opciones de compatibilidad para la VM de destino. Pero cuando lo ejecutas, fallará porque el método ofensivo no está presente (obtendrás una MethodNotFoundException o ClassNotFoundException).
Por esta razón, siempre comparo la configuración de compatibilidad con la versión real de Java con la que estoy creando. Si no coinciden, fallo la construcción.
fuente
if(JavaVersion.current() != JavaVersion.VERSION_1_8) throw new GradleException("This project requires Java 8, but it's running on "+JavaVersion.current())
Así es como soluciono este problema, justo al comienzo del archivo build.gradle.javac
opción--release
destinada a abordar este problema, al permitir solo el uso de API disponible en la versión de Java especificada. Para más información, consulte stackoverflow.com/a/43103038/4653517sourceCompatibility = especifica que se utilizará la versión del lenguaje de programación Java para compilar archivos .java . Por ejemplo, sourceCompatibility 1.6 = especifica que la versión 1.6 del lenguaje de programación Java se utilizará para compilar archivos .java .
Por defecto sourceCompatibility = "versión de la JVM actual en uso" y targetCompatibility = sourceCompatibility
targetCompatibility = La opción asegura que los archivos de clase generados serán compatibles con las máquinas virtuales especificadas por targetCompatibility. Tenga en cuenta que en la mayoría de los casos, el valor de la opción -target es el valor de la opción -source; en ese caso, puede omitir la opción -target.
Los archivos de clase se ejecutarán en el destino especificado por targetCompatibility y en versiones posteriores, pero no en versiones anteriores de la VM
fuente
En mi opinión, "sourceCompatibility" se refiere a la característica que puede usar en su código fuente. Por ejemplo, si establece sourceCompatibility a 1.7, entonces no puede usar la expresión lambda, que es una nueva característica en java 8 aunque su versión jdk sea 1.8.
En cuanto a "targetCompatibility", significa en qué versión de jre se puede ejecutar el archivo de clase generado; si lo configura en 1.8, es posible que no se ejecute correctamente en jdk 1.7, pero generalmente se puede ejecutar en una versión superior de jdk.
fuente
Estas son las banderas para el comando javac.
En otras palabras: escribe un código en una
source
versión y compila sus clases en latarget
versión VM. Para ejecutarlo, por ejemplo, en otra estación de trabajo con una versión anterior de Java.De acuerdo con: https://docs.oracle.com/en/java/javase/11/tools/javac.html
fuente