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.
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.
JAVA_HOME
in den Parametern zur Erstellungszeit einSie 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?
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
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
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"
sourceCompatibility
, targetCompatibility
von build.gradle
Recommended Posts