Gradle, "sourceCompatibility" vs "targetCompatibility"?


130

Qual è la relazione / differenza tra sourceCompatibilitye targetCompatibility? Cosa succede quando sono impostati su valori diversi?

Secondo la documentazione Gradle :

sourceCompatibilityè "Compatibilità versione Java da utilizzare durante la compilazione del sorgente Java." targetCompatibilityè "Versione Java per cui generare classi."

La mia comprensione è che targetCompatibilitygenererà bytecode java compatibile con una versione specifica di Java, è questo un sottoinsieme delle funzionalità di sourceCompatibility?

Risposte:



63

Fai attenzione quando li usi; siamo stati morsi da persone che fanno ipotesi.

Solo perché usi sourceCompability (o targetCompatibility) di 1.5 non significa che puoi sempre compilare il tuo codice con JDK 1.6 e aspettarti che funzioni con JDK 1.5. Il problema sono le librerie disponibili.

Se il tuo codice chiama un metodo disponibile solo in JDK 1.6, verrà comunque compilato con le varie opzioni di compatibilità per la VM di destinazione. Ma quando lo esegui, fallirà perché il metodo offensivo non è presente (otterrai un MethodNotFoundException o ClassNotFoundException).

Per questo motivo, confronto sempre l'impostazione Compatibilità con la versione Java effettiva in uso. Se non corrispondono, fallisco la compilazione.


4
Questa è un'osservazione sottile, ma molto importante.
Natix,

Come li confronti?
zero01alpha,

Perché non riesci a creare? L'opzione "bootstrap classpath" è data solo per mitigare questo problema. Puoi sempre usare il bootstrap corretto e dovrebbe funzionare bene.
Codebender

6
if(JavaVersion.current() != JavaVersion.VERSION_1_8) throw new GradleException("This project requires Java 8, but it's running on "+JavaVersion.current())Questo è il modo in cui risolvo questo problema, proprio all'inizio del file build.gradle.
Xerus,

2
A partire da Java 9 è ora disponibile una nuova javacopzione --releaseper risolvere questo problema, consentendo solo l'uso dell'API disponibile nella versione Java specificata. Per ulteriori informazioni, consultare stackoverflow.com/a/43103038/4653517
James Mudd,

35

sourceCompatibility = specifica che la versione del linguaggio di programmazione Java deve essere utilizzata per compilare file .java . es. sourceCompatibility 1.6 = specifica che la versione 1.6 del linguaggio di programmazione Java deve essere utilizzata per compilare file .java .

Per impostazione predefinita sourceCompatibility = "versione dell'attuale JVM in uso" e targetCompatibility = sourceCompatibility

targetCompatibility = L'opzione garantisce che i file di classe generati siano compatibili con le macchine virtuali specificate da targetCompatibility. Si noti che nella maggior parte dei casi, il valore dell'opzione -target è il valore dell'opzione -source; in tal caso, puoi omettere l'opzione -target.

I file di classe verranno eseguiti sulla destinazione specificata da targetCompatibility e su versioni successive, ma non su versioni precedenti della VM


come possiamo capire quali sono i nostri progetti?
isJulian00

0

A mio avviso, "sourceCompatibility" indica la funzione che è possibile utilizzare nel codice sorgente. Ad esempio, se si imposta sourceCompatibility su 1.7, non è possibile utilizzare l'espressione lambda quale nuova funzionalità in java 8 anche se la versione jdk è 1.8.
Per quanto riguarda "targetCompatibility", significa su quale versione di jre può essere eseguito il file di classe generato, se lo si imposta su 1.8, potrebbe non funzionare correttamente su jdk 1.7, ma di solito può essere eseguito su una versione successiva di jdk.


0

Questi sono i flag per il comando javac.

javac [options] [sourcefiles]

Options:
...
-source release - Specifies the version of source code accepted.
...
-target release - Generates class files for a specific VM version.
...

In altre parole: scrivi un codice in una sourceversione e compila le tue classi nella targetversione VM. Per eseguirlo, ad es. Su un'altra workstation con versione java precedente.

Secondo: https://docs.oracle.com/en/java/javase/11/tools/javac.html

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.