Ich hatte zufällig den Auftrag, eine mit Java 8 erstellte Anwendung so zu ändern, dass sie mit Java 6 funktioniert. Ich denke, das ist ungewöhnlich, also fasse ich sie zusammen. Ich glaube nicht, dass ich das normalerweise mache ... (Und ich wollte diese Art von Arbeit nicht machen)
Ich habe eine Restful Java 8-Anwendung, die ich in einem anderen Projekt verwendet habe Als ich versuchte, die Anwendung auf mein Projekt anzuwenden Der Server, auf dem sich die Anwendung befindet, heißt Red Hat Enterprise Linux 5.1 ...
Ich wollte, dass Sie das Betriebssystem des Servers aktualisieren, auf dem Sie es bereitstellen möchten, aber es ist nicht zumutbar, da andere Anwendungen ausgeführt werden ...
Aus diesem Grund habe ich mich für ein Downgrade von Java8 auf Java6 entschieden.
Laut Wiki ist Red Hat Enterprise Linux 5.1 übrigens 10 Jahre alt und wurde am 7. November 2007 veröffentlicht. Die Standard-Support-Frist ist der 31. März 2017, und die Standard-Support-Frist ist bereits abgelaufen. Erweiterte Unterstützung ist bis zum 30. November 2020 ...
Hier sind einige typische Funktionen, die in Java 8 hinzugefügt wurden.
Zusätzlich wurden viele Funktionen hinzugefügt. Weitere Informationen finden Sie unter Versionshinweise.
Wie Sie sehen, gab es in Java 8 viele Änderungen an der API und der Beschreibungsmethode, und die Änderungen waren für Java sehr groß.
Java backporting tools Java-Backporting-Tools ist ein Programm zum Konvertieren von Java-Klassendateien von einer Version in eine ältere Version. Die folgenden zwei wurden dieses Mal verwendet.
Retrolambda Retro Lambda ist ein Maven, Gradle Plugin Beim Erstellen wird die Java 8-Beschreibung in eine niedrigere Version konvertiert. Betrachtet man die erstellte Klassendatei, so wird neben "XXX.class" eine Klassendatei wie "XXX $$ Lambda $ 9.class" ausgegeben. Es ist ersichtlich, dass Java 8-Beschreibungen wie Lambda-Ausdrücke als separate Klassendateien verarbeitet werden.
Folgendes wird von Retrolambda unterstützt.
Fast alle neuen Beschreibungen werden unterstützt.
Hier werde ich erklären, wie man es in Maven benutzt. Informationen zu Gradle finden Sie unter Read Me here.
Beschreiben Sie Folgendes in pom.xml.
<plugin>
<groupId>net.orfjackal.retrolambda</groupId>
<artifactId>retrolambda-maven-plugin</artifactId>
<version>2.5.1</version>
<executions>
<execution>
<goals>
<goal>process-main</goal>
<goal>process-test</goal>
</goals>
</execution>
</executions>
<configuration>
<target>1.6</target>
</configuration>
</plugin>
Jetzt wird es automatisch im mvn-Lebenszyklus erstellt.
configuration.target
beschreibt die konvertierte Java-Version.
Entwickeln Sie beim Entwickeln (Einstellungen wie IDE) mit Java8 SDK, Das durch das Erstellen erstellte Jar wird von Java6 ausgeführt.
Das Problem bei dieser Methode ist, dass sie auch dann kompiliert werden kann, wenn Sie die Java 8-API verwenden (natürlich wird zur Laufzeit ein Fehler angezeigt). Es scheint einen Plug zu geben, der davor warnt. (Ich habe es nicht benutzt)
Streamsupport deckt viele neue Java 8-APIs ab. Die behandelten sind wie folgt.
pom.xml
Fügen Sie Folgendes zu Abhängigkeiten
in pom.xml hinzu.
(Streamsupport.version ist in "Eigenschaften" definiert.)
<!-- To use Java8 stream,functional API in Java6 -->
<dependency>
<groupId>net.sourceforge.streamsupport</groupId>
<artifactId>streamsupport</artifactId>
<version>${streamsupport.version}</version>
</dependency>
<dependency>
<groupId>net.sourceforge.streamsupport</groupId>
<artifactId>streamsupport-cfuture</artifactId>
<version>${streamsupport.version}</version>
</dependency>
<dependency>
<groupId>net.sourceforge.streamsupport</groupId>
<artifactId>streamsupport-flow</artifactId>
<version>${streamsupport.version}</version>
</dependency>
<dependency>
<groupId>net.sourceforge.streamsupport</groupId>
<artifactId>streamsupport-atomic</artifactId>
<version>${streamsupport.version}</version>
</dependency>
<dependency>
<groupId>net.sourceforge.streamsupport</groupId>
<artifactId>streamsupport-literal</artifactId>
<version>${streamsupport.version}</version>
</dependency>
Grundsätzlich kann es mit demselben Klassennamen und demselben Methodennamen mit einem anderen Paketnamen als der Java8-API aufgerufen werden.
Zum Beispiel die Completable Future API
import java.util.concurrent.CompletableFuture;
↓
import java8.util.concurrent.CompletableFuture;
so werden.
Sie können eine Stream-Instanz mit "RefStreams.of" erstellen.
import java8.util.stream.RefStreams;
RefStreams.of("a", "b", "c")
.map(String::toUpperCase)
.forEach(System.out::println);
In Java 8 wird die Stream-Methode wie folgt zur List-Klasse hinzugefügt. In diesem Fall ist es wie folgt.
import java.util.Arrays;
import java.util.List;
List<String> list = Arrays.asList("a", "b", "c");
list.stream()
.map(String::toUpperCase)
.forEach(System.out::println);
↓
import java.util.Arrays;
import java.util.List;
import java8.util.stream.StreamSupport;
List<String> list = Arrays.asList("a", "b", "c");
StreamSupport.stream(list)
.map(String::toUpperCase)
.forEach(System.out::println);
Ich hoffe, dass die Leser dieses Artikels nicht die Möglichkeit haben, Java 8-Anwendungen auf Java 6 herunterzustufen. .. ..