Java 9 javac
hat eine neue Flagge --release
:
> javac --help
...
--release <release>
Compile for a specific VM version. Supported targets: 6, 7, 8, 9
Wie unterscheidet es sich von -source
und -target
Flaggen? Ist es nur eine Abkürzung für -source X -target X
?
Antworten:
Nicht genau.
JEP 247: Kompilieren für ältere Plattformversionen definiert diese neue Befehlszeilenoption
--release
:Also nein, es ist nicht gleichbedeutend mit
-source N -target N
. Der Grund für diesen Zusatz ist im Abschnitt "Motivation" angegeben:Kurz gesagt, die Angabe der Quell- und Zieloptionen reicht für die Kreuzkompilierung nicht aus. Da
javac
standardmäßig Kompilierungen mit den neuesten Plattform-APIs durchgeführt werden, kann nicht garantiert werden, dass sie auf älteren Versionen ausgeführt werden. Sie müssen auch die-bootclasspath
Option angeben, die der älteren Version entspricht, um die Kompilierung korrekt durchzuführen. Dies würde die richtige API-Version enthalten, mit der kompiliert werden kann, und die Ausführung auf einer älteren Version ermöglichen. Da es sehr oft vergessen wurde, wurde beschlossen, eine Befehlszeilenoption hinzuzufügen, die alle notwendigen Schritte zum korrekten Cross-Kompilieren ausführte.Lesen Sie weiter in der Mailingliste und in Oracle Docs . Der ursprüngliche Fehler wurde hier abgelegt . Beachten Sie, dass JDK-Builds seit der Integration dieser Option mit Beschreibungen der Plattform-APIs älterer Versionen gebündelt sind, die im Abschnitt "Risiken und Annahmen" aufgeführt sind. Das bedeutet, dass Sie die ältere Version nicht auf Ihrem Computer installiert haben müssen, damit die Cross-Kompilierung funktioniert.
quelle
--release
Flag wird aus dem zum Kompilieren verwendeten JDK abgeleitet, das sich im Allgemeinen von dem JDK unterscheidet, auf das Sie mit-source
und abzielen-target
. Dies kann Sie beißen, falls Sie Klassen / Methoden verwenden, die in nie JDK eingeführt wurden, als die, auf die Sie abzielen. Dies ist besonders subtil , falls der Compiler ein Verfahren wählt Überlastung , die von früheren in späteren Version über einen hinzugefügt wurde , um Ihnen so leise Binärkompatibilität brechen soll.--release X
ist mehr als nur eine Verknüpfung zu,-source X -target X
weil-source
und-target
nicht ausreicht, um sicher zu einer älteren Version zu kompilieren. Sie müssen auch ein-bootclasspath
Flag setzen, das der älteren Version entsprechen muss (und dieses Flag wird oft vergessen). Also, in Java 9 machten sie eine einzige--release
Fahne , die ein Ersatz für drei Flags ist:-source
,-target
und-bootclasspath
.Dies ist also ein Beispiel für das Kompilieren mit Java 1.7:
javac --release 7 <source files>
Beachten Sie, dass JDK 7 nicht einmal auf Ihrem Computer installiert sein muss. JDK 9 enthält bereits die erforderlichen Informationen, um zu verhindern, dass Sie versehentlich auf Symbole verlinken, die in JDK 7 nicht vorhanden waren.
quelle