Was ist der Unterschied zwischen „sourceCompatibility“ und „targetCompatibility“?

Lesezeit: 4 Minuten

Mike Rylanders Benutzeravatar
Mike Rylander

Was ist die Beziehung/der Unterschied zwischen sourceCompatibility Und targetCompatibility? Was passiert, wenn sie auf unterschiedliche Werte eingestellt werden?

Entsprechend der Toolchain und Kompatibilität Abschnitt der Java-Plugin Gradle-Dokumentation:

  • sourceCompatibility ist „Java-Versionskompatibilität, die beim Kompilieren der Java-Quelle verwendet werden soll.“
  • targetCompatibility ist „Java-Version, für die Klassen generiert werden sollen.“

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

Matts Benutzeravatar
Matt

targetCompatibility Und sourceCompatibility Karten zu -target release Und -source release in Javac. Quelle ist im Grunde die Ebene der Quellsprache und Ziel die Ebene des generierten Bytecodes.

Weitere Details finden Sie im Cross-Compilation-Optionen für javac Abschnitt von Werkzeugreferenz für Java 8, für Java 11, für Java 17oder für Java 19.

Benutzeravatar von user1644873
Benutzer1644873

Seien Sie vorsichtig, wenn Sie diese verwenden. Wir wurden von Leuten gebissen, die Annahmen machten.

Nur weil Sie sourceCompatibility (oder targetCompatibility) von 1.5 verwenden, heißt 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 zufällig eine Methode aufruft, die nur in JDK 1.6 verfügbar ist, wird er dennoch mit den verschiedenen Kompatibilitätsoptionen für die Ziel-VM kompiliert. Wenn Sie es jedoch ausführen, schlägt es fehl, da die fehlerhafte Methode nicht vorhanden ist (Sie erhalten eine MethodNotFoundException oder ClassNotFoundException).

Aus diesem Grund habe ich stets Vergleichen Sie die Kompatibilitätseinstellung mit der tatsächlichen Java-Version, unter der ich baue. Wenn sie nicht übereinstimmen, schlägt der Build fehl.

  • Dies ist eine subtile, aber sehr wichtige Beobachtung.

    – Natix

    8. April 2016 um 13:23


  • Wie vergleicht man sie?

    – zweites Frühstück

    20. September 2016 um 18:00 Uhr

  • Warum scheitert der Build? Die Option „Bootstrap-Klassenpfad“ dient lediglich der Behebung dieses Problems. Sie können immer den richtigen Bootstrap verwenden und es sollte einwandfrei funktionieren.

    – Codebender

    9. November 2016 um 15:30 Uhr

  • if(JavaVersion.current() != JavaVersion.VERSION_1_8) throw new GradleException("This project requires Java 8, but it's running on "+JavaVersion.current()) So löse ich dieses Problem gleich zu Beginn der Datei build.gradle.

    – xeruf

    6. November 2017 um 10:28

  • Seit Java 9 gibt es nun eine neue javac Möglichkeit --release Ziel war es, dieses Problem zu lösen, indem nur die Verwendung der API zugelassen wurde, die in der angegebenen Java-Version verfügbar ist. Weitere Informationen hierzu finden Sie unter stackoverflow.com/a/43103038/4653517

    – James Mudd

    29. März 2019 um 9:05 Uhr

Quellkompatibilität = gibt an, dass zum Kompilieren die Version der Programmiersprache Java verwendet werden soll .Java Dateien. zB sourceCompatibility 1.6 = gibt an, dass Version 1.6 der Programmiersprache Java zum Kompilieren verwendet werden soll .Java Dateien.

Standardmäßig ist sourceCompatibility = „Version der aktuell verwendeten JVM“ und targetCompatibility = sourceCompatibility

Zielkompatibilität = Die Option stellt sicher, dass die generierten Klassendateien mit den durch 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 durch targetCompatibility angegebenen Ziel und auf späteren Versionen ausgeführt, jedoch nicht auf früheren Versionen der VM

  • Wie finden wir heraus, welche unser Projekt verwendet?

    – isJulian00

    15. Juni 2019 um 19:49 Uhr

Es wurden viele gute Erklärungen dazu gegeben sourceCompatibility vs targetCompatibility ist gut für und einen weiteren guten Artikel finden Sie hier Gradle: Quellkompatibilität vs. Zielkompatibilität. Aber statt sourceCompatibility vs targetCompatibility Ich würde vorschlagen, den Gradle zu verwenden toolchain (sehen Toolchains für JVM-Projekte) was macht release oder sourceCompatibility Optimierungen veraltet und Garantien, dass Sprachfunktionen (sourceCompatibility), Bytecode (targetCompatibility) und Java-API/-Bibliotheken (release) stimmt mit der Java-Version überein. (Einziger Nachteil ist, dass die IDE-Unterstützung noch nicht vollständig etabliert ist, aber auf dem Weg ist).

Meiner Meinung nach bedeutet „Quellenkompatibilität“ die Funktion, die Sie in Ihrem Quellcode verwenden können. Wenn Sie beispielsweise Quellenkompatibilität auf 1.7 setzen, können Sie den Lambda-Ausdruck nicht verwenden, was eine neue Funktion in Java 8 ist, obwohl Sie eine JDK-Version haben 1.8.
Was „Zielkompatibilität“ betrifft, bedeutet dies, auf welcher JRE-Version die generierte Klassendatei ausgeführt werden kann. Wenn Sie sie auf 1.8 setzen, wird sie unter JDK 1.7 möglicherweise nicht erfolgreich ausgeführt, kann aber normalerweise auf einer höheren JDK-Version ausgeführt werden.

  • Dies erklärt wirklich im Detail, was mit der Entwicklung zu tun hat.

    – Victor Choy

    7. September 2022 um 3:13

Benjamins Benutzeravatar
Benjamin

Dies sind die Flags für den Javac-Befehl.

javac [options] [sourcefiles]

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

Mit anderen Worten: Sie schreiben einen Code in a source Version und kompilieren Sie Ihre Klassen zur target VM-Version. Um es zB auf einem anderen Arbeitsplatzrechner mit älterer Java-Version auszuführen.

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

  • Dies erklärt wirklich im Detail, was mit der Entwicklung zu tun hat.

    – Victor Choy

    7. September 2022 um 3:13

1454310cookie-checkWas ist der Unterschied zwischen „sourceCompatibility“ und „targetCompatibility“?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy