Exécuter des applications écrites en Java8 en Java6

J'ai eu un travail pour modifier une application créée en Java 8 pour qu'elle s'exécute sous Java 6, donc je pense que c'est inhabituel, alors je vais le résumer. Je ne pense pas que je fais ça d'habitude ... (Et je ne voulais pas faire ce genre de travail)

Contexte

J'ai une application Restful Java 8 que j'utilisais dans un autre projet Lorsque j'ai essayé d'appliquer l'application à mon projet Le serveur sur lequel l'application est placée s'appelle Red Hat Enterprise Linux 5.1 ...

Je voulais que vous mettiez à niveau le système d'exploitation du serveur sur lequel vous souhaitez le déployer, mais ce n'est pas raisonnable car d'autres applications sont en cours d'exécution ...

C'est pourquoi j'ai décidé de passer de Java8 à Java6.

Incidemment, selon Wiki, Red Hat Enterprise Linux 5.1 a 10 ans, publié le 7 novembre 2007. La date limite de support standard est le 31 mars 2017 et la date limite de support standard est déjà expirée. Le support étendu est jusqu'au 30 novembre 2020 ...

Modifications et ajouts de spécifications dans Java 8

Voici quelques fonctionnalités typiques ajoutées dans Java 8.

En plus de cela, de nombreuses fonctions ont été ajoutées. Voir Notes de version pour plus de détails.

Comme vous pouvez le voir, il y a eu de nombreux changements dans l'API et la méthode de description dans Java 8, et les changements étaient très importants pour Java.

Java backporting tools Java backporting tools est un programme permettant de convertir des fichiers de classe Java d'une version à une version plus ancienne. Les deux suivants ont été utilisés cette fois.

Retrolambda Retro Lambda est un plugin Maven, Gradle Il convertit la description Java 8 en une version inférieure lors de la construction. En regardant le fichier de classe construit, en dehors de XXX.class, un fichier de classe tel que XXX $$ Lambda $ 9.class est affiché, On peut voir que les descriptions Java 8 telles que les expressions Lambda sont traitées comme des fichiers de classe séparés.

Les éléments suivants sont pris en charge par Retrolambda.

Presque toutes les nouvelles descriptions sont prises en charge.

Comment utiliser

Ici, je vais vous expliquer comment l'utiliser dans Maven. Pour Gradle, voir Lisez-moi ici.

Décrivez comme suit dans 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>

Maintenant, il sera construit automatiquement sur le cycle de vie mvn. configuration.target décrit la version Java convertie.

Lors du développement (paramètres tels que IDE), développer à l'aide du SDK Java8, Java 6 est utilisé pour exécuter le Jar construit.

Le problème avec cette méthode est qu'elle peut être compilée même si vous utilisez l'API Java 8 (bien sûr, vous obtiendrez une erreur à l'exécution), Il semble y avoir un plug qui en avertit. (Je ne l'ai pas utilisé)

streamsupport

streamsupport couvre de nombreuses nouvelles API Java 8. Ceux couverts sont les suivants.

Comment utiliser

pom.xml Ajoutez ce qui suit aux dépendances dans pom.xml. (Streamsupport.version est défini dans properties.)

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

Utilisation de base

Fondamentalement, il peut être appelé avec le même nom de classe et le même nom de méthode avec un nom de package différent de l'API java8.

Par exemple, l'API Completable Future

import java.util.concurrent.CompletableFuture;

import java8.util.concurrent.CompletableFuture;

devenir de cette façon.

Comment utiliser l'API Stream

Vous pouvez créer une instance de flux avec RefStreams.of.


import java8.util.stream.RefStreams;

RefStreams.of("a", "b", "c")
    .map(String::toUpperCase)
    .forEach(System.out::println);

Dans Java 8, la méthode stream est ajoutée à la classe List comme suit. Dans ce cas, c'est comme suit.

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

Impressions

J'espère que les lecteurs n'auront pas la possibilité de rétrograder les applications Java 8 vers Java 6. .. ..

Recommended Posts

Exécuter des applications écrites en Java8 en Java6
Exécuter un lot avec docker-compose avec Java batch
Exécuter Java VM avec Web Assembly
[Tutoriel] Télécharger Eclipse → Lancer l'application Web avec Java (Pléiades)
J'ai créé une application Android qui GET avec HTTP
Créer une classe immuable avec JAVA
À propos de la création d'applications avec Springboot
J'ai fait une annotation en Java.
Exécuter un processus externe en Java
J'ai essayé de créer une application Android avec MVC maintenant (Java)
[Java] Créer un module exécutable avec Gradle
Application Java EE One-JAR avec WebSphere Liberty
J'ai créé un serveur écologique avec scala
Développement Java avec Codenvy: Hello World! Run
Distributeur automatique fabriqué avec Java (piloté par domaine)
Exécutez l'application WEB avec Spring Boot + Thymeleaf
État de l'application Java 9+
Exécuter Rust depuis Java avec JNA (Java Native Access)
Outil GUI refactorisé réalisé avec Java8 + JavaFX en 2016
Course d'obstacles facile avec traitement pour Java
Créer un environnement de test E2E avec Selenium (Java)
Application Java CICS-Run - (1) Exécutez un exemple d'application simple
[Java] Trouvez le nombre premier avec le tamis Eratostenes
S'entendre avec les conteneurs Java dans Cloud Run
Créez un environnement ARM-cpu avec qemu sur mac et exécutez java [Résultat → Échec]
Installez java avec Homebrew
Tracez le SQL exécuté avec l'agent java Application Insights
[Java] Trouvez le nombre premier avec le tamis Eratostenes (Partie 2)
Essayez d'exécuter une application créée avec Quarkus sur Heroku
Installez Java avec Ansible
Les utilisateurs Java expérimentés se lancent dans le développement d'applications Android
[java] Lancer une exception
Rendre les gadgets de calendrier créés avec JavaFX compatibles avec Java SE 9
Exécutez PostgreSQL sur Java
Téléchargement confortable avec JAVA
Changer java avec direnv
Implémentez rapidement singleton avec enum en Java
Téléchargement Java avec Ansible
Raclons avec Java! !!
Application de reconnaissance faciale conçue avec Amazon Rekognition et Java
Construire Java avec Wercker
[Rails] Créer une application
Java EE sans serveur à partir de Quarkus et Cloud Run
Conversion Endian avec JAVA
Déployez des applications Java développées localement avec Cloud Toolkit sur des instances Alibaba Cloud ECS
Histoire de créer une application de gestion de tâches avec Swing, Java
J'ai fait un interpréteur (compilateur?) Avec environ 80 lignes en Ruby.
Premiers pas avec Java et création d'un éditeur Ascii Doc avec JavaFX
Parquet-tools donne java.lang.ExceptionInInitializerError, donc je l'ai fait fonctionner avec java8
Je veux pousser une application créée avec Rails 6 vers GitHub
J'ai fait un adaptateur pour la classe de communication avec Retrofit2 + Rx2
Exécuter l'analyse avec OpenJDK11 Java Flight Recorder + Google Kubernetes Engine
Construction d'environnement de développement d'applications Web Java avec VS Code (struts2)
Java: démarrez WAS avec Docker et déployez votre propre application
(Java) BDD facile avec Spectrum?
Utiliser des couches Lambda avec Java