Comment changer dynamiquement les JDK lors de la construction de Java avec Gradle

introduction

OpenJDK11 est sorti en septembre 2018. Si vous utilisez Java pour les projets d'entreprise, vous avez probablement beaucoup de JDK11. De plus, j'ai entendu des personnes qui utilisent déjà JDK8 mais qui souhaitent adopter JDK11 pour certains nouveaux projets.

J'utilise JDK8 cette fois, mais quand j'ai commencé à vérifier avec JDK11, je me suis demandé quel type de paramètres de construction serait bon si je voulais prendre en charge (construire) à la fois JDK8 et JDK11 dans la construction avec Gradle. .. Il convient de noter que les modifications apportées au JDK, la modification de l'application due à la mise à niveau de la version, le réglage, etc. sont des éléments nécessaires, mais ils sont exclus de cet article. Je veux juste me concentrer sur la façon de changer dynamiquement le JDK au moment de la construction.

Réglages

1. Spécifiez les paramètres avec sourceCompatibility, targetCompatibility de build.gradle

Je pense que la version JDK est souvent spécifiée comme une valeur fixe dans build.gradle. (Ou répertorié dans gradle.properties)

L'image est la suivante.

build.gradle


...

sourceCompatibility = 1.8
targetCompatibility = 1.8

...

Ou si vous mettez la valeur dans gradle.properties

build.gradle


...

sourceCompatibility = javaVersion
targetCompatibility = javaVersion

...

gradle.properties


...
javaVersion=1.8
...

C'est une image.

Je veux changer dynamiquement au moment de la construction, donc la définition de build.gradle est

build.gradle


...

sourceCompatibility = javaVersion
targetCompatibility = javaVersion

...

Et définissez-le avec une variable.

2. Définissez la version JDK et JAVA_HOME dans les paramètres au moment de la construction

Vous pouvez spécifier le paramètre avec -Pkey = valeur de gradle. Vous pouvez l'utiliser pour spécifier la version JDK au moment de l'exécution, par exemple gradle build -PjavaVersion = 1.11. Vous devez également spécifier le JDK utilisé par Gradle. Cela peut être spécifié avec le paramètre «org.gradle.java.home».

Donc

gradle build -PjavaVersion=1.11 -Dorg.gradle.java.home="C:\java\11 --info"

N'est-ce pas bon de faire comme ça?

Vérification

Structure du projet

Créez la structure du projet comme suit.

C:
└─src
    └─main
       ├─java
       │  └─sample
       │      └─gradle
       │          └─multiversion
       │              Sample.java
       └─resources

build.gradle


plugins {
    id 'java-library'
}

repositories {
    jcenter()
}

dependencies {
}

sourceCompatibility = javaVersion
targetCompatibility = javaVersion

Construire et vérifier avec JDK11

Construire avec JDK11.

>gradle build -PjavaVersion=1.11 -Dorg.gradle.java.home="C:\java\11"

BUILD SUCCESSFUL in 1s
2 actionable tasks: 2 executed

Vérifiez la version construite avec javap -v pour le fichier de classe réellement compilé.

Comme vous pouvez le voir dans le résultat de l'exécution ci-dessous, vous pouvez voir qu'il est construit avec version majeure: 55 et JDK11.

C:\workspace\sample-gradle-multiversion>javap -v build\classes\java\main\sample\gradle\multiversion\Sample.class
Classfile /C:/workspace/sample-gradle-multiversion/build/classes/java/main/sample/gradle/multiversion/Sample.class
  Last modified 2019/07/12; size 576 bytes
  MD5 checksum 580cd2384cb91a31c14e09339617ba75
  Compiled from "Sample.java"
public class sample.gradle.multiversion.Sample
  minor version: 0
  major version: 55
  flags: (0x0021) ACC_PUBLIC, ACC_SUPER
  this_class: #5                          // sample/gradle/multiversion/Sample
  super_class: #6                         // java/lang/Object
  interfaces: 0, fields: 0, methods: 2, attributes: 1
Constant pool:
   #1 = Methodref          #6.#20         // java/lang/Object."<init>":()V
   #2 = Fieldref           #21.#22        // java/lang/System.out:Ljava/io/PrintStream;
   #3 = String             #23            // Hello world.
   #4 = Methodref          #24.#25        // java/io/PrintStream.println:(Ljava/lang/String;)V
   #5 = Class              #26            // sample/gradle/multiversion/Sample
   #6 = Class              #27            // java/lang/Object
   #7 = Utf8               <init>
   #8 = Utf8               ()V
   #9 = Utf8               Code
  #10 = Utf8               LineNumberTable
  #11 = Utf8               LocalVariableTable
  #12 = Utf8               this
  #13 = Utf8               Lsample/gradle/multiversion/Sample;
  #14 = Utf8               main
  #15 = Utf8               ([Ljava/lang/String;)V
  #16 = Utf8               args
  #17 = Utf8               [Ljava/lang/String;
  #18 = Utf8               SourceFile
  #19 = Utf8               Sample.java
  #20 = NameAndType        #7:#8          // "<init>":()V
  #21 = Class              #28            // java/lang/System
  #22 = NameAndType        #29:#30        // out:Ljava/io/PrintStream;
  #23 = Utf8               Hello world.
  #24 = Class              #31            // java/io/PrintStream
  #25 = NameAndType        #32:#33        // println:(Ljava/lang/String;)V
  #26 = Utf8               sample/gradle/multiversion/Sample
  #27 = Utf8               java/lang/Object
  #28 = Utf8               java/lang/System
  #29 = Utf8               out
  #30 = Utf8               Ljava/io/PrintStream;
  #31 = Utf8               java/io/PrintStream
  #32 = Utf8               println
  #33 = Utf8               (Ljava/lang/String;)V
{
  public sample.gradle.multiversion.Sample();
    descriptor: ()V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 6: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   Lsample/gradle/multiversion/Sample;

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: (0x0009) ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=1, args_size=1
         0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
         3: ldc           #3                  // String Hello world.
         5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
         8: return
      LineNumberTable:
        line 10: 0
        line 12: 8
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       9     0  args   [Ljava/lang/String;
}
SourceFile: "Sample.java"

Gardez gradle clean pour supprimer le fichier de classe construit avec JDK 11.

C:\workspace\sample-gradle-multiversion>gradle clean -PjavaVersion=1.11

BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed

Construire et vérifier avec JDK8

Puis compilez avec JDK8.

C:\workspace\sample-gradle-multiversion>gradle build -PjavaVersion=1.8 -Dorg.gradle.java.home="C:\java\8"

BUILD SUCCESSFUL in 1s
2 actionable tasks: 2 executed

Vérifiez le fichier de classe. Vous pouvez voir qu'il a été construit avec version majeure: 52 et JDK8.

C:\workspace\sample-gradle-multiversion>javap -v build\classes\java\main\sample\gradle\multiversion\Sample.class
Classfile /C:/workspace/sample-gradle-multiversion/build/classes/java/main/sample/gradle/multiversion/Sample.class
  Last modified 2019/07/12; size 576 bytes
  MD5 checksum ea23dd24700da60b773d93f8ff2f9d77
  Compiled from "Sample.java"
public class sample.gradle.multiversion.Sample
  minor version: 0
  major version: 52
  flags: (0x0021) ACC_PUBLIC, ACC_SUPER
  this_class: #5                          // sample/gradle/multiversion/Sample
  super_class: #6                         // java/lang/Object
  interfaces: 0, fields: 0, methods: 2, attributes: 1
Constant pool:
   #1 = Methodref          #6.#20         // java/lang/Object."<init>":()V
   #2 = Fieldref           #21.#22        // java/lang/System.out:Ljava/io/PrintStream;
   #3 = String             #23            // Hello world.
   #4 = Methodref          #24.#25        // java/io/PrintStream.println:(Ljava/lang/String;)V
   #5 = Class              #26            // sample/gradle/multiversion/Sample
   #6 = Class              #27            // java/lang/Object
   #7 = Utf8               <init>
   #8 = Utf8               ()V
   #9 = Utf8               Code
  #10 = Utf8               LineNumberTable
  #11 = Utf8               LocalVariableTable
  #12 = Utf8               this
  #13 = Utf8               Lsample/gradle/multiversion/Sample;
  #14 = Utf8               main
  #15 = Utf8               ([Ljava/lang/String;)V
  #16 = Utf8               args
  #17 = Utf8               [Ljava/lang/String;
  #18 = Utf8               SourceFile
  #19 = Utf8               Sample.java
  #20 = NameAndType        #7:#8          // "<init>":()V
  #21 = Class              #28            // java/lang/System
  #22 = NameAndType        #29:#30        // out:Ljava/io/PrintStream;
  #23 = Utf8               Hello world.
  #24 = Class              #31            // java/io/PrintStream
  #25 = NameAndType        #32:#33        // println:(Ljava/lang/String;)V
  #26 = Utf8               sample/gradle/multiversion/Sample
  #27 = Utf8               java/lang/Object
  #28 = Utf8               java/lang/System
  #29 = Utf8               out
  #30 = Utf8               Ljava/io/PrintStream;
  #31 = Utf8               java/io/PrintStream
  #32 = Utf8               println
  #33 = Utf8               (Ljava/lang/String;)V
{
  public sample.gradle.multiversion.Sample();
    descriptor: ()V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 6: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   Lsample/gradle/multiversion/Sample;

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: (0x0009) ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=1, args_size=1
         0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
         3: ldc           #3                  // String Hello world.
         5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
         8: return
      LineNumberTable:
        line 10: 0
        line 12: 8
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       9     0  args   [Ljava/lang/String;
}
SourceFile: "Sample.java"

Conclusion

  1. Défini comme une variable dans sourceCompatibility, targetCompatibility de build.gradle
  2. Lors de la construction de Gradle, définissez la version JDK avec le paramètre «-P» et «JAVA_HOME» avec «-Dorg.gradle.java.home».

Recommended Posts

Comment changer dynamiquement les JDK lors de la construction de Java avec Gradle
[Java] Comment passer de jdk ouvert à jdk oracle
Lorsque vous souhaitez remplacer dynamiquement l'annotation dans Java 8
Comment exécuter Ant dans Gradle
Comment apprendre JAVA en 7 jours
Comment utiliser les classes en Java?
Comment nommer des variables en Java
Comment changer Java à l'ère d'OpenJDK sur Mac
Comment basculer dynamiquement entre FIN et RST dans Netty
Comment concaténer des chaînes avec Java
Comment changer de version Java avec direnv dans le terminal sur Mac
Comment résoudre l'erreur inconnue apparue lors de l'utilisation de slf4j en Java
Comment implémenter le calcul de la date en Java
Comment implémenter le filtre de Kalman par Java
Prise en charge multilingue de Java Comment utiliser les paramètres régionaux
Comment faire une conversion de base en Java
Comment changer de version de Java sur Mac
Comment appliquer les conventions de codage en Java
Comment intégrer Janus Graph dans Java
Comment obtenir la date avec Java
Comment basculer entre plusieurs versions de Java
Comment trouver le nombre total de pages lors de la pagination en Java
Comment passer un proxy lors du lancement de REST avec SSL en Java
Comment afficher une page Web en Java
Comment obtenir une classe depuis Element en Java
Comment masquer les champs nuls en réponse en Java
Comment installer Oracle JDK 1.8 dans Ubuntu 18.04 LTS?
Comment résoudre les problèmes d'expression en Java
Comment écrire Java String # getBytes dans Kotlin?
Comment utiliser Gradle
Comment appeler des fonctions en bloc avec la réflexion Java
Comment basculer Tomcat context.xml avec Eclipse WTP
Comment créer un URI de données (base64) en Java
Organisé comment interagir avec le JDK par étapes
Comment passer d'Oracle Java 8 à Adopt Open JDK 9
Ce que j'ai appris lors de la création d'un serveur en Java
Comment convertir A en A et A en A en utilisant le produit logique et la somme en Java
Comment convertir un fichier en tableau d'octets en Java
Comment Git gérer les projets Java EE dans Eclipse
Résumé de la mise en œuvre des arguments par défaut en Java
Comment mettre l'ancien Java (série 8) dans macOS 10.15 Catalina
Remarques sur l'utilisation des expressions régulières en Java
Comment obtenir le nom de classe de l'argument de LoggerFactory.getLogger lors de l'utilisation de SLF4J en Java
Résumé de l'utilisation du jeu de proxy dans IE lors de la connexion avec Java
Comment obtenir le nom d'une classe / méthode exécutée en Java
Comment lire votre propre fichier YAML (*****. Yml) en Java
[Java] Comment utiliser Map
Comment désinstaller Java 8 (Mac)
Branchement conditionnel Java: comment créer et étudier des instructions de commutation
Java - Comment créer JTable
Comment utiliser les données JSON dans la communication WebSocket (Java, JavaScript)
Comment régler chrony lorsque le temps change dans CentOS7
Comment utiliser java Facultatif
Mémo: [Java] Comment vérifier groupId etc. décrit dans pom.xml
Comment réduire les images Java
Comment rédiger un commentaire java
Comment utiliser la classe Java