2013-05-20 15 views
66

Qual è la relazione/differenza tra sourceCompatibility e targetCompatibility? Cosa succede quando sono impostati su valori diversi?Gradle, "sourceCompatibility" vs "targetCompatibility"?

Secondo Gradle documentation:

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

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

risposta

44

questa mappa fino a javac - vedere the cross compilation section - la fonte è fondamentalmente il livello della lingua di origine e la destinazione è il livello del bytecode generato.

31

Fare attenzione quando si utilizzano questi; siamo stati morsi da persone che fanno ipotesi.

Solo perché si utilizza sourceCompability (o targetCompatibility) di 1.5 non significa che è sempre possibile compilare il codice con JDK 1.6 e si aspetta che funzioni con JDK 1.5. Il problema sono le librerie disponibili.

Se il codice capita di chiamare 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 incriminato non è presente (otterrai un MethodNotFoundException o ClassNotFoundException).

Per questo motivo, ho sempre confrontare l'impostazione di compatibilità per la versione attuale di Java sto costruendo sotto. Se non corrispondono, non riesco a costruire.

+2

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

+0

Come li confronti? – zero01alpha

+0

Perché non riesci a costruire? L'opzione "classpath bootstrap" viene fornita solo per mitigare questo problema. Puoi sempre usare il bootstrap appropriato e dovrebbe funzionare bene. – Codebender

17

sourceCompatibility = specifica che la versione del linguaggio di programmazione Java essere utilizzato per compilare .java file. e.g sourceCompatibility 1.6 = specifica che la versione 1.6 del linguaggio di programmazione Java può essere utilizzata per compilare i file .java.

Con sourceCompatibility = "versione della JVM corrente in uso" default e targetCompatibility = sourceCompatibility

targetCompatibility = L'opzione assicura che i file di classe generati saranno compatibili con le macchine virtuali specificato 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.

File di classe verrà eseguito sul target specificato da targetCompatibility e versioni successive, ma non su versioni precedenti del VM

Problemi correlati