Frage Gradle, "sourceCompatibility" vs "targetCompatibility"?


Worin besteht die Beziehung / Differenz? sourceCompatibility und targetCompatibility? Was passiert, wenn sie auf unterschiedliche Werte eingestellt sind?

Gemäß Gradle Dokumentation:

sourceCompatibility ist "Java-Versionskompatibilität für die Kompilierung von Java-Quellen." targetCompatibility ist "Java-Version zum Generieren von Klassen für."

Mein Verständnis ist das targetCompatibility wird Java-Bytecode generieren, der mit einer bestimmten Version von Java kompatibel ist, ist dies eine Teilmenge der Funktionalität von sourceCompatibility?


75
2018-05-20 17:31


Ursprung


Antworten:


Dies führt zu JavaC - siehe der Kreuz-Kompilierungsabschnitt - Quelle ist im Grunde die Quellsprachenebene und Ziel ist die Ebene des Bytecodes, der generiert wird.


53
2018-05-21 09:07



Sei vorsichtig, wenn du diese verwendest; Wir wurden von Menschen gebissen, die Vermutungen anstellen.

Nur weil Sie sourceCompability (oder targetCompatibility) von 1.5 verwenden, bedeutet das nicht, dass Sie Ihren Code immer mit JDK 1.6 kompilieren können und erwarten, dass er unter JDK 1.5 funktioniert. Das Problem sind die verfügbaren Bibliotheken.

Wenn Ihr Code eine Methode aufruft, die nur in JDK 1.6 verfügbar ist, kompiliert er weiterhin mit den verschiedenen Kompatibilitätsoptionen für die Ziel-VM. Aber wenn Sie es ausführen, wird es fehlschlagen, weil die problematische Methode nicht vorhanden ist (Sie erhalten eine MethodNotFoundException oder ClassNotFoundException).

Aus diesem Grund habe ich immer vergleiche die Kompatibilitätseinstellung mit der tatsächlichen Java-Version, unter der ich arbeite. Wenn sie nicht übereinstimmen, scheitere ich den Build.


37
2018-03-11 13:22



Quellkompatibilität = gibt an, dass die Version der Java-Programmiersprache zum Kompilieren verwendet wird .Java Dateien. z. B. sourceCompatibility 1.6 = gibt an, dass Version 1.6 der Programmiersprache Java zum Kompilieren verwendet wird .Java Dateien.

Standardmäßig ist sourceCompatibility = "Version der aktuellen JVM in Verwendung" und targetCompatibility = sourceCompatibility 

targetCompatibility = Die Option stellt sicher, dass die generierten Klassendateien mit den von targetCompatibility angegebenen VMs kompatibel sind. Beachten Sie, dass in den meisten Fällen der Wert der Option -target der Wert der Option -source ist; In diesem Fall können Sie die Option -target weglassen.

Klassendateien werden auf dem Ziel ausgeführt, das in targetCompatibility und in späteren Versionen angegeben ist, jedoch nicht in früheren Versionen der VM


22
2018-04-08 15:33