Wie gebe ich die JDK-Version an?
1) <java.version>wird in der Maven-Dokumentation nicht erwähnt.
Es ist eine Spring Boot-Spezifität.
Es ermöglicht das Festlegen der Quell- und der Ziel-Java-Version mit derselben Version wie dieser, um Java 1.8 für beide anzugeben:
<properties>
<java.version>1.8</java.version>
</properties>
Fühlen Sie sich frei, es zu verwenden, wenn Sie Spring Boot verwenden.
2) Verwenden von maven-compiler-pluginoder maven.compiler.source/ maven.compiler.targetEigenschaften, um die sourceund die targetsind äquivalent.
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
und
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
sind gemäß der Maven-Dokumentation des Compiler-Plugins äquivalent,
da die <source>und die <target>Elemente in der Compilerkonfiguration die Eigenschaften verwenden maven.compiler.sourceund maven.compiler.targetob sie definiert sind.
Quelle
Das -sourceArgument für den Java-Compiler.
Der Standardwert ist : 1.6.
Benutzereigenschaft ist : maven.compiler.source.
Ziel
Das -targetArgument für den Java-Compiler.
Der Standardwert ist : 1.6.
Benutzereigenschaft ist : maven.compiler.target.
Informationen zu den Standardwerten für sourceund targetBeachten Sie, dass sich
die Standardwerte seit dem 3.8.0Maven-Compiler von 1.5bis geändert haben1.6 .
3) Das Maven-Compiler-Plugin 3.6und spätere Versionen bieten einen neuen Weg:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>9</release>
</configuration>
</plugin>
Sie könnten auch nur erklären:
<properties>
<maven.compiler.release>9</maven.compiler.release>
</properties>
Derzeit funktioniert dies jedoch nicht, da die von maven-compiler-pluginIhnen verwendete Standardversion nicht auf einer ausreichend aktuellen Version basiert.
Das Maven- releaseArgument vermittelt release: eine neue JVM-Standardoption , die wir von Java 9 übergeben könnten:
Kompiliert gegen die öffentliche, unterstützte und dokumentierte API für eine bestimmte VM-Version.
Auf diese Weise bietet einen Standard - Weg , um die gleiche Version für den angeben source, die targetund die bootstrapJVM - Optionen.
Beachten Sie, dass die Angabe von bootstrapeine gute Vorgehensweise für Cross-Compilations ist und nicht schadet, wenn Sie auch keine Cross-Compilations durchführen.
Wie kann die JDK-Version am besten angegeben werden?
Der erste Weg ( <java.version>) ist nur zulässig, wenn Sie Spring Boot verwenden.
Für Java 8 und niedriger:
Zu den beiden anderen Möglichkeiten: Bewerten der maven.compiler.source/ maven.compiler.targetEigenschaften oder Verwenden der maven-compiler-plugin, können Sie die eine oder andere verwenden. An den Fakten ändert sich nichts, da die beiden Lösungen schließlich auf denselben Eigenschaften und demselben Mechanismus beruhen: dem Maven-Core-Compiler-Plugin.
Wenn Sie im Compiler-Plugin keine anderen Eigenschaften oder Verhaltensweisen als Java-Versionen angeben müssen, ist die Verwendung dieser Methode sinnvoller, da dies prägnanter ist:
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
Aus Java 9:
Das releaseArgument (dritter Punkt) ist eine Möglichkeit, stark zu überlegen, ob Sie dieselbe Version für die Quelle und das Ziel verwenden möchten.
Was passiert, wenn sich die Version zwischen dem JDK in JAVA_HOME und dem in der Datei pom.xml angegebenen unterscheidet?
Es ist kein Problem, wenn das JDK, auf das von verwiesen JAVA_HOMEwird, mit der im pom angegebenen Version kompatibel ist. Um jedoch eine bessere Kompatibilität zwischen Kompilierungen zu gewährleisten, sollten Sie die bootstrapJVM-Option mit dem Wert des Pfads rt.jarder targetVersion als Wert hinzufügen .
Es ist wichtig zu beachten, dass die sourceund die targetVersion in der Maven-Konfiguration der JDK-Version, auf die von verwiesen wird, nicht überlegen sein sollten JAVA_HOME.
Eine ältere Version des JDK kann nicht mit einer neueren Version kompiliert werden, da die Spezifikation nicht bekannt ist.
Informationen zu den unterstützten Quell-, Ziel- und Release-Versionen gemäß dem verwendeten JDK finden Sie unter Java-Kompilierung: Quell-, Ziel- und Release-unterstützte Versionen .
Wie wird der von JAVA_HOME referenzierte Fall von JDK behandelt, der nicht mit den im pom angegebenen Java-Ziel- und / oder Quellversionen kompatibel ist?
Wenn Sie beispielsweise JAVA_HOMEauf ein JDK 1.7 verweisen und in der Compilerkonfiguration Ihrer pom.xml ein JDK 1.8 als Quelle und Ziel angeben, ist dies ein Problem, da das JDK 1.7 wie erläutert nicht kompilieren kann .
Aus seiner Sicht ist es eine unbekannte JDK-Version, seit sie danach veröffentlicht wurde.
In diesem Fall sollten Sie das Maven-Compiler-Plugin so konfigurieren, dass das JDK folgendermaßen angegeben wird:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerVersion>1.8</compilerVersion>
<fork>true</fork>
<executable>D:\jdk1.8\bin\javac</executable>
</configuration>
</plugin>
Weitere Details finden Sie in Beispielen mit dem Maven Compiler Plugin .
Es wird nicht gefragt, aber Fälle, in denen dies komplizierter sein kann, sind die Angabe der Quelle, aber nicht des Ziels. Je nach Quellversion wird möglicherweise eine andere Version im Ziel verwendet. Regeln sind besonders: Sie können sie im Teil Cross-Compilation Options lesen .
Warum wird das Compiler-Plugin bei der Ausführung des Maven- packageZiels in der Ausgabe verfolgt, auch wenn Sie es nicht in der Datei pom.xml angeben?
Um Ihren Code zu kompilieren und allgemeiner alle für ein Maven-Ziel erforderlichen Aufgaben auszuführen, benötigt Maven Tools. So nutzt es Kern Maven Plugins (Sie einen Core Maven Plugin erkennt durch seine groupId: org.apache.maven.plugins) die erforderlichen Aufgaben zu tun: Compiler - Plugin für die Erstellung von Klassen, Test - Plugin zum Ausführen von Tests, und so für ... Also, auch wenn Sie dies nicht tun Deklarieren Sie diese Plugins, sie sind an die Ausführung des Maven-Lebenszyklus gebunden.
Im Stammverzeichnis Ihres Maven-Projekts können Sie den folgenden Befehl ausführen: mvn help:effective-pomum den endgültigen POM effektiv zu nutzen. Sie können unter anderem angehängte Plugins von Maven (angegeben oder nicht in Ihrer pom.xml angegeben) mit der verwendeten Version, ihrer Konfiguration und den ausgeführten Zielen für jede Phase des Lebenszyklus anzeigen.
In der Ausgabe des mvn help:effective-pomBefehls sehen Sie die Deklaration dieser Kern-Plugins im <build><plugins>Element, zum Beispiel:
...
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>2.5</version>
<executions>
<execution>
<id>default-clean</id>
<phase>clean</phase>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>default-testResources</id>
<phase>process-test-resources</phase>
<goals>
<goal>testResources</goal>
</goals>
</execution>
<execution>
<id>default-resources</id>
<phase>process-resources</phase>
<goals>
<goal>resources</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<executions>
<execution>
<id>default-compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>default-testCompile</id>
<phase>test-compile</phase>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
...
Weitere Informationen hierzu finden Sie in der Einführung zum Maven-Lebenszyklus in der Maven-Dokumentation .
Sie können diese Plugins jedoch deklarieren, wenn Sie sie mit anderen Werten als Standardwerte konfigurieren möchten (z. B. wenn Sie das Maven-Compiler-Plugin in Ihrer pom.xml deklariert haben, um die zu verwendende JDK-Version anzupassen) oder wenn Sie Ich möchte einige Plugin-Ausführungen hinzufügen, die im Maven-Lebenszyklus nicht standardmäßig verwendet werden.
<maven.compiler.x>von nun an bei der Eigenschaft bleibt .