Führen Sie in Java8 geschriebene Anwendungen in Java6 aus

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)

Hintergrund

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 ...

Spezifikationsänderungen und Ergänzungen in Java 8

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.

Wie benutzt man

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

Streamsupport deckt viele neue Java 8-APIs ab. Die behandelten sind wie folgt.

Wie benutzt man

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>

Grundlegende Verwendung

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.

Verwendung der Stream-API

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);

Impressionen

Ich hoffe, dass die Leser dieses Artikels nicht die Möglichkeit haben, Java 8-Anwendungen auf Java 6 herunterzustufen. .. ..

Recommended Posts

Führen Sie in Java8 geschriebene Anwendungen in Java6 aus
Führen Sie Batch mit Docker-Compose mit Java-Batch aus
Führen Sie Java VM mit Web Assembly aus
[Tutorial] Eclipse herunterladen → Webanwendung mit Java ausführen (Plejaden)
Ich habe eine Android-App erstellt, die mit HTTP abgerufen wird
Erstellen Sie mit JAVA eine unveränderliche Klasse
Informationen zum Erstellen von Apps mit Springboot
Ich habe eine Anmerkung in Java gemacht.
Führen Sie einen externen Prozess in Java aus
Ich habe versucht, eine Android-Anwendung mit MVC zu erstellen (Java)
[Java] Erstellen Sie mit Gradle ein ausführbares Modul
One-JAR Java EE-Anwendung mit WebSphere Liberty
Ich habe einen Öko-Server mit Scala gemacht
Java-Entwicklung mit Codenvy: Hello World! Run
Verkaufsautomat mit Java (domänengesteuert)
Führen Sie die WEB-Anwendung mit Spring Boot + Thymeleaf aus
Java 9+ Anwendungsstatus
Führen Sie Rust von Java mit JNA (Java Native Access) aus.
Überarbeitetes GUI-Tool, das 2016 mit Java8 + JavaFX erstellt wurde
Einfaches Hindernisrennen mit Java-Verarbeitung
Erstellen Sie eine E2E-Testumgebung mit Selenium (Java).
CICS-Java-Anwendung ausführen- (1) Führen Sie eine einfache Beispielanwendung aus
[Java] Finden Sie die Primzahl mit dem Eratostenes-Sieb
Kommen Sie mit Java-Containern in Cloud Run zurecht
Erstellen Sie eine ARM-CPU-Umgebung mit qemu auf dem Mac und führen Sie Java aus [Ergebnis → Fehler]
Installieren Sie Java mit Homebrew
Verfolgen Sie die mit dem Java-Agenten Insights der Anwendung ausgeführte SQL
[Java] Finde die Primzahl mit dem Eratostenes-Sieb (Teil 2)
Versuchen Sie, eine mit Quarkus erstellte App auf Heroku auszuführen
Installieren Sie Java mit Ansible
Erfahrene Java-Benutzer beginnen mit der Entwicklung von Android-Apps
[Java] Wirf eine Ausnahme aus
Machen Sie mit JavaFX erstellte Kalender-Gadgets mit Java SE 9 kompatibel
Führen Sie PostgreSQL unter Java aus
Bequemer Download mit JAVA
Schalten Sie Java mit direnv
Implementieren Sie Singleton mit Enum schnell in Java
Java-Download mit Ansible
Lass uns mit Java kratzen! !!
Gesichtserkennungs-App mit Amazon Rekognition und Java
Erstellen Sie Java mit Wercker
[Rails] Erstellen Sie eine Anwendung
Serverloses Java EE beginnend mit Quarkus und Cloud Run
Endian-Konvertierung mit JAVA
Stellen Sie lokal entwickelte Java-Anwendungen mit Cloud Toolkit auf Alibaba Cloud ECS-Instanzen bereit
Die Geschichte der Erstellung einer Task-Management-Anwendung mit Swing, Java
Ich habe einen Interpreter (Compiler?) Mit ungefähr 80 Zeilen in Ruby erstellt.
Erste Schritte mit Java und Erstellen eines Ascii Doc-Editors mit JavaFX
Parkett-Tools gibt java.lang.ExceptionInInitializerError, also habe ich es mit java8 funktionieren lassen
Ich möchte eine mit Rails 6 erstellte App an GitHub senden
Ich habe einen Adapter für den Kommunikationsunterricht mit Retrofit2 + Rx2 erstellt
Führen Sie die Analyse mit OpenJDK11 Java Flight Recorder + Google Kubernetes Engine aus
Erstellung einer Java-Webanwendungsentwicklungsumgebung mit VS-Code (struts2)
Java: Starten Sie WAS mit Docker und stellen Sie Ihre eigene Anwendung bereit
(Java) Einfache BDD mit Spektrum?
Verwenden Sie Lambda-Ebenen mit Java