Dynamisches Wechseln von JDKs beim Erstellen von Java mit Gradle

Einführung

OpenJDK11 wurde im September 2018 veröffentlicht. Wenn Sie Java für Unternehmensprojekte verwenden, haben Sie wahrscheinlich viel JDK11. Außerdem habe ich einige Leute gehört, die bereits JDK8 verwenden, aber JDK11 für einige neue Projekte übernehmen möchten.

Dieses Mal verwende ich JDK8, aber als ich anfing, mit JDK11 zu testen, fragte ich mich, welche Build-Einstellungen gut wären, wenn ich sowohl JDK8 als auch JDK11 für das Erstellen mit Gradle unterstützen (erstellen) wollte. .. Es ist zu beachten, dass Änderungen am JDK, Änderungen der Anwendung aufgrund des Versions-Upgrades, Optimierungen usw. notwendige Elemente sind, die jedoch von diesem Artikel ausgeschlossen sind. Ich möchte mich nur darauf konzentrieren, wie das JDK beim Erstellen dynamisch umgeschaltet wird.

die Einstellungen

1. Geben Sie die Parameter mit "sourceCompatibility", "targetCompatibility" von "build.gradle" an

Ich denke, dass die JDK-Version oft als fester Wert in "build.gradle" angegeben wird. (Oder aufgeführt in gradle.properties)

Das Bild ist wie folgt.

build.gradle


...

sourceCompatibility = 1.8
targetCompatibility = 1.8

...

Oder wenn Sie den Wert in "gradle.properties" eingeben

build.gradle


...

sourceCompatibility = javaVersion
targetCompatibility = javaVersion

...

gradle.properties


...
javaVersion=1.8
...

Es ist ein Bild.

Ich möchte zur Erstellungszeit dynamisch wechseln, daher lautet die Definition von "build.gradle"

build.gradle


...

sourceCompatibility = javaVersion
targetCompatibility = javaVersion

...

Und definieren Sie es mit einer Variablen.

2. Stellen Sie die JDK-Version und JAVA_HOME in den Parametern zur Erstellungszeit ein

Sie können den Parameter mit -Pkey = value von gradle angeben. Sie können dies verwenden, um die JDK-Version zur Laufzeit anzugeben, z. B. "gradle build -PjavaVersion = 1.11". Sie müssen auch das von Gradle verwendete JDK angeben. Dies kann mit dem Parameter org.gradle.java.home angegeben werden.

Deshalb

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

Ist es nicht gut so zu machen?

Bestätigung

Projektstruktur

Machen Sie die Projektstruktur wie folgt.

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

build.gradle


plugins {
    id 'java-library'
}

repositories {
    jcenter()
}

dependencies {
}

sourceCompatibility = javaVersion
targetCompatibility = javaVersion

Erstellen und überprüfen Sie mit JDK11

Mit JDK11 erstellen.

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

BUILD SUCCESSFUL in 1s
2 actionable tasks: 2 executed

Überprüfen Sie die mit javap -v erstellte Version auf die tatsächlich kompilierte Klassendatei.

Wie Sie dem folgenden Ausführungsergebnis entnehmen können, können Sie sehen, dass es mit der Hauptversion 55 und JDK11 erstellt wurde.

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"

Halten Sie "gradle clean", um die mit JDK 11 erstellte Klassendatei zu entfernen.

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

BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed

Erstellen und überprüfen Sie mit JDK8

Dann mit JDK8 bauen.

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

Überprüfen Sie die Klassendatei. Sie können sehen, dass es mit Hauptversion: 52 und JDK8 gebaut wurde.

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"

Fazit

  1. Definiert als Variable in sourceCompatibility , targetCompatibility von build.gradle
  2. Stellen Sie beim Erstellen von Gradle die JDK-Version mit den Parametern "-P" und "JAVA_HOME" mit "-Dorg.gradle.java.home" ein.

Recommended Posts

Dynamisches Wechseln von JDKs beim Erstellen von Java mit Gradle
[Java] So wechseln Sie von Open JDK zu Oracle JDK
Wenn Sie Annotation in Java 8 dynamisch ersetzen möchten
Wie man Ant in Gradle ausführt
Wie man JAVA in 7 Tagen lernt
Wie verwende ich Klassen in Java?
So benennen Sie Variablen in Java
So wechseln Sie Java in der OpenJDK-Ära auf dem Mac
So wechseln Sie in Netty dynamisch zwischen FIN und RST
So verketten Sie Zeichenfolgen mit Java
So wechseln Sie die Java-Version mit direnv im Terminal auf dem Mac
So beheben Sie den unbekannten Fehler, der bei der Verwendung von slf4j in Java aufgetreten ist
So implementieren Sie die Datumsberechnung in Java
So implementieren Sie den Kalman-Filter mit Java
Mehrsprachige Unterstützung für Java Verwendung des Gebietsschemas
So führen Sie eine Basiskonvertierung in Java durch
So wechseln Sie Java-Versionen auf dem Mac
So erzwingen Sie Codierungskonventionen in Java
Einbetten von Janus Graph in Java
So erhalten Sie das Datum mit Java
So wechseln Sie zwischen mehreren Java-Versionen
So ermitteln Sie die Gesamtzahl der Seiten beim Paging in Java
So übergeben Sie einen Proxy, wenn Sie REST mit SSL in Java auslösen
So zeigen Sie eine Webseite in Java an
So erhalten Sie eine Klasse von Element in Java
So verbergen Sie Nullfelder als Antwort in Java
Wie installiere ich Oracle JDK 1.8 in Ubuntu 18.04 LTS?
So lösen Sie Ausdrucksprobleme in Java
Wie schreibe ich Java String # getBytes in Kotlin?
Wie benutzt man Gradle?
Aufrufen von Funktionen in großen Mengen mit Java Reflection
So wechseln Sie Tomcat context.xml mit Eclipse WTP
So erstellen Sie einen Daten-URI (base64) in Java
Organisierte schrittweise Interaktion mit dem JDK
So wechseln Sie von Oracle Java 8 zu Adopt Open JDK 9
Was ich beim Erstellen eines Servers in Java gelernt habe
So konvertieren Sie A in a und a in A mit logischem Produkt und Summe in Java
So konvertieren Sie eine Datei in ein Byte-Array in Java
So verwalten Sie Java EE-Projekte in Eclipse
Zusammenfassung der Implementierung von Standardargumenten in Java
Wie man altes Java (8er) in macOS 10.15 Catalina einfügt
Hinweise zur Verwendung regulärer Ausdrücke in Java
So erhalten Sie den Klassennamen des Arguments von LoggerFactory.getLogger, wenn Sie SLF4J in Java verwenden
Zusammenfassung der Verwendung des im IE festgelegten Proxy-Sets bei der Verbindung mit Java
So erhalten Sie den Namen einer Klasse / Methode, die in Java ausgeführt wird
So lesen Sie Ihre eigene YAML-Datei (*****. Yml) in Java
[Java] Verwendung von Map
So deinstallieren Sie Java 8 (Mac)
Bedingte Java-Verzweigung: Erstellen und Studieren von switch-Anweisungen
Java - So erstellen Sie JTable
Verwendung von JSON-Daten in der WebSocket-Kommunikation (Java, JavaScript)
So stellen Sie die Chronik ein, wenn sich die Zeit in CentOS7 verschiebt
Verwendung von Java Optional
Anmerkung: [Java] Überprüfen der in pom.xml beschriebenen groupId usw.
So minimieren Sie Java-Images
Wie schreibe ich einen Java-Kommentar
Verwendung der Java-Klasse