2017-12-14 3 views
0

Ich bin derzeit gradle und es scheint, wie ich sourcecompatibility und targetcompatibility durch Java-Pluginsourcecompatiblity targetcompatibility Nutzung Gründe

Ich frage mich, was die Gründe für uns sourcecompatibility/targetcompatibility andere als verwenden, um zu sein rückwärtskompatibel mit älteres JDK?

Wäre es einfacher, auf das neueste Java zu aktualisieren, wenn die Option für die Quellkompatibilität/Zielkompatibilität nicht eingestellt ist?

Sollten Quellkompatibilität und Zielkompatibilität überhaupt verwendet werden?

Antwort

1

Die sourceCompatibility und targetCompatability Variablen beziehen sich direkt auf die -source-target und schaltet javac. Diese werden für das Cross-Compilieren verwendet (relevant documentation for javac, relevant SO question). Der einzige Zweck dieser Werte besteht darin, Ihre Klassendateien rückwärtskompatibel zu machen. Sie dienen keinem anderen Zweck. Dies ist eine Funktion, die aus Sicherheitsgründen mehr oder weniger hinzugefügt wurde. Anstatt ein älteres, weniger sicheres JDK auf Ihrem Computer zu installieren, können Sie einen neueren installieren und diese Werte verwenden, um Ihren Code zu kompilieren.

Diese Flags haben jedoch eine wichtige Einschränkung: Nur weil Sie diese Werte festlegen, heißt das nicht, dass der Code, den Sie schreiben, auf älteren JVMs funktioniert. Dies liegt daran, dass javac Ihre Klassen kompiliert, um sie mit einer älteren JVM kompatibel zu machen. Sie können jedoch weiterhin eine Bindung mit einer Methode herstellen, die in dieser älteren JVM nicht vorhanden ist.

Zum Beispiel, wenn Sie Ihre Kompatibilität Werte '1.6' gesetzt und Sie laufen Ihre Builds JDK 8, Sie immer noch Code wie folgt schreiben:

Objects.equals(obj1, obj2); 

Und der Compiler nicht beklagen. Es wird immer noch bauen, ohne sich über diese Linie zu beschweren. Allerdings, wenn Sie versucht, es mit Java 6 zu laufen, würden Sie einen Fehler erhalten, dass Objects.equals existiert nicht, weil Objects in Java 7.

eingeführt wurde, anders gesagt: -source und -targetmachen Ihre .class-Dateien kompatibel mit älteren JVMs, aber sie nicht validieren Klassen und Methoden verwendet von Ihrem Code. Der einzige Weg, dies zu tun, ist mit -bootclasspath, an diesem Punkt können Sie auch nur mit dem älteren JDK herunterladen und kompilieren, da Sie dies tun müssen, um die Datei dafür zu erhalten (relevant SO question).

In Bezug auf die Aktualisierung beschränkt das Festlegen dieser Werte nicht unbedingt Ihre Upgrade-Fähigkeit. Code, den Sie schreiben, muss mit dem Wert kompatibel sein, den Sie verwenden, wenn Sie ihn in dieser Version verwenden möchten, aber nichts hindert Sie daran, sie zu ändern und die neueren Funktionen und APIs zu verwenden.