Wir haben ein Java-Projekt, das wir an Benutzer verteilen möchten. Es verwendet keine Java-Funktionen jenseits von Java 1.5, daher möchten wir, dass es auf Java 1.5 und höher läuft.
An dieser Stelle können Sie mit Recht feststellen, dass Java 1.6 das älteste derzeit verfügbare ist, warum also Java 1.5? Dies ändert jedoch nichts an der allgemeinen Frage der Cross-Compilierung für ältere Versionen.
So beginnt man gewöhnlich mit Cross-Compilation-Versuchen, indem man -source 1.5
und -target 1.5
-Optionen auf javac
setzt. Dann erhält man eine berühmte Warnung, dass -bootclasspath
nicht gesetzt ist:
Nach Oracle Blog-Post und offizielle Dokumentation , die korrekte Vorgehensweise für die Cross-Compilation ist:
Um Javac von JDK N zu verwenden, um einen Cross-Compiler auf eine ältere Plattformversion zu bringen, ist die korrekte Vorgehensweise:
- Verwenden Sie die Einstellung für ältere Quellen.
- Legen Sie fest, dass der Bootclasspath für die ältere Plattform mit der Datei rt.jar (oder einem entsprechenden Gegenstück) kompiliert wird.
Wenn der zweite Schritt nicht ausgeführt wird, verwendet javac pflichtgemäß die alten Sprachregeln in Kombination mit neuen Bibliotheken, was zu Klassendateien führen kann, die auf der älteren Plattform nicht funktionieren, da Verweise auf nicht existierende Methoden einbezogen werden können / p>
Zum Beispiel die offizielle Dokumentation:
%Vor%Das ist großartig und wurde schon oft sowohl auf Stack Overflow als auch auf dem Rest des Internets beantwortet.
Keine der gefundenen Ressourcen scheint jedoch anzugeben, wo die rt.jar
für ältere Java-Versionen tatsächlich zu finden sind. Als Beispiel wird JDK 1.7 nicht mit rt.jar
ausgeliefert, außer dem eigenen:
Das lässt vermuten, dass man zum Beispiel für Java 1.6 rt.jar
benötigt, um JDK 1.6 herunterzuladen. Aber dann tauchen zwei Fragen auf:
Also, wie geben wir die Option -bootclasspath
an, um diese Cross-Compilierungsfunktion zu verwenden?
Diese Art der Kompilierung wird in erster Linie dadurch motiviert, dass eine JRE, die sich bereits in Produktion befindet, oder eine ansonsten vorhandene Installation (IME) ausgewählt werden muss. In diesem Fall wäre es die erste Aufgabe, die JRE-bootclasspath-Dateien von der vorhandenen Installation abzurufen und sie von den Build-Systemen zur Verfügung zu stellen. Der von Ihnen angegebene Bootclasspath-Wert hängt davon ab, wo Sie die JRE-Bootclasspath-Dateien während dieses Schritts abgelegt haben.
Zu Ihrer Information, Sie brauchen vielleicht noch ein paar Dateien mehr als nur rt.jar. ZB wenn Sie auf IBM Java 6 abzielen.
Die rt.jar ist in der JRE enthalten. Sie können die Kreuzkompilierung durchführen, wenn Sie beispielsweise JDK 1.6 und JRE 1.5 haben.
Verwenden Sie Ihr JDK 1.6:
%Vor%Der Vorteil hierbei ist, dass die JRE nur 1/3 der Größe eines vollständigen JDK betragen kann. Sie können alte JDK-Versionen oft entfernen, ohne alte JRE-Versionen zu entfernen.
Wenn Sie eine alte JRE erwerben möchten, finden Sie diese auf der Java Archive-Seite Ссылка
Tags und Links java cross-compiling javac