wake-up-neo.com

Java-Version in Maven angeben - Unterschiede zwischen Eigenschaften und Compiler-Plugin

Ich bin nicht sehr erfahren mit maven und als ich mit Multimodulprojekten experimentierte, begann ich mich zu fragen, wie ich die Java-Version für alle meine Kindermodule in übergeordnetem maven pom angeben kann. Bis heute habe ich nur verwendet:

<properties>
    <Java.version>1.8</Java.version>
</properties>

bei der Recherche habe ich jedoch festgestellt, dass Sie die Java-Version auch im maven Compiler-Plugin angeben können:

<plugins>
    <plugin>    
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
        </configuration>
    </plugin>
</plugins>

Und dann packen Sie dies in ein Plugin-Management-Tag ein, um die Verwendung durch Poms zu ermöglichen. Die erste Frage ist also Was sind die Unterschiede zwischen der Einstellung der Java-Version in den Eigenschaften und im Maven-Compiler-Plugin?

Ich konnte keine klare Antwort finden, aber bei der Recherche habe ich festgestellt, dass Sie auch die Java-Version auf diese Weise angeben können:

<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

was darauf hindeutet, dass das Compiler-Plugin vorhanden ist, auch wenn ich es nicht explizit deklariere. Ausführen von mvn-Paketausgaben mit 

maven-compiler-plugin:3.1:compile (default-compile) @ testproj ---

und einige andere Plugins, die ich nicht deklariert habe. Also sind diese Plugins Standard, versteckter Teil von Maven Pom? Gibt es Unterschiede zwischen der Einstellung von Quelle/Ziel in den Eigenschaften und im Konfigurationselement von maven plugin?

Einige andere Fragen sind - welcher Weg sollte verwendet werden (und wann, wenn sie nicht gleich sind)? Welches ist am besten für ein Multi-Modul-Projekt und was passiert, wenn die in pom angegebene Java-Version sich von der in Java_HOME angegebenen Version unterscheidet?

112
Plebejusz

Wie spezifiziere ich die JDK-Version?

1) Auf <Java.version> Wird in der Maven-Dokumentation nicht verwiesen.
Es ist eine Spring Boot-Spezifität.
Sie können die Quell- und die Zielversion Java mit derselben Version wie dieser festlegen, um Java 1.8 für beide festzulegen:

<properties>
     <Java.version>1.8</Java.version>
</properties>   

Fühlen Sie sich frei, es zu verwenden, wenn Sie Spring Boot verwenden.

2) Die Verwendung der Eigenschaften maven-compiler-plugin Oder maven.compiler.source/maven.compiler.target Zur Angabe von source und target ist ä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äß Maven-Dokumentation des Compiler-Plugins äquivalent, da die Elemente <source> und <target> in der Compilerkonfiguration die Eigenschaften maven.compiler.source und maven.compiler.target Wenn sie definiert sind.

source

Das Argument -source Für den Compiler Java.
Standardwert ist: 1.6.
Benutzereigenschaft ist: maven.compiler.source.

target

Das Argument -target Für den Compiler Java.
Standardwert ist: 1.6.
Benutzereigenschaft ist: maven.compiler.target.

Beachten Sie bezüglich der Standardwerte für source und target, dass seit dem 3.8.0 Des Maven-Compilers haben sich die Standardwerte von 1.5 Geändert. zu 1.6 .

3) Das Maven-Compiler-Plugin 3.6 Und 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 deklarieren:

<properties>
    <maven.compiler.release>9</maven.compiler.release>
</properties>

Derzeit funktioniert dies jedoch nicht, da die von Ihnen verwendete Standardversion maven-compiler-plugin Nicht auf einer ausreichend aktuellen Version basiert.

Das Argument Maven release vermittelt release: a neue JVM-Standardoption , das 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 können Sie standardmäßig dieselbe Version für die JVM-Optionen source, target und bootstrap angeben.
Beachten Sie, dass die Angabe von bootstrap eine gute Methode für Cross-Kompilierungen ist und nicht schadet, wenn Sie auch keine Cross-Kompilierungen durchführen.


Wie kann die JDK-Version am besten angegeben werden?

Der erste Weg (<Java.version>) Ist nur bei Verwendung von Spring Boot zulässig.

Für Java 8 und darunter:

Zwei weitere Möglichkeiten: Sie können die Eigenschaften maven.compiler.source/maven.compiler.target oder mit maven-compiler-plugin Bewerten andere. Es ändert nichts an den Fakten, da die beiden Lösungen letztendlich auf den gleichen Eigenschaften und dem gleichen Mechanismus beruhen: dem Maven Core Compiler Plugin.

Wenn Sie im Compiler-Plugin keine anderen Eigenschaften oder Verhaltensweisen als Java angeben müssen, ist die Verwendung dieser Methode sinnvoller, da dies übersichtlicher ist:

<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

Von Java 9:

Mit dem Argument release (dritter Punkt) können Sie genau ü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 pom.xml angegebenen unterscheidet?

Es ist kein Problem, wenn das JDK, auf das durch Java_HOME Verwiesen wird, mit der in pom angegebenen Version kompatibel ist. Um jedoch eine bessere Kompilierungskompatibilität zu gewährleisten, sollten Sie die JVM-Option bootstrap mit dem Wert hinzufügen der Pfad des rt.jar der target Version.

Es ist wichtig zu berücksichtigen, dass die Version source und target in der Maven-Konfiguration der JDK-Version, auf die mit Java_HOME Verwiesen wird, nicht überlegen sein sollte.
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: Unterstützte Quell-, Ziel- und Release-Versionen .


Wie wird der Fall von JDK behandelt, auf den von Java_HOME verwiesen wird, ist nicht kompatibel mit den Java Ziel- und/oder Quellversionen, die im pom angegeben sind?

Wenn sich Ihr Java_HOME Auf ein JDK 1.7 bezieht und Sie ein JDK 1.8 als Quelle und Ziel in der Compilerkonfiguration Ihrer pom.xml angeben, ist dies ein Problem, da das JDK 1.7, wie erläutert, nicht funktioniert. Ich weiß nicht, wie ich es kompilieren soll.
Aus seiner Sicht handelt es sich um eine unbekannte JDK-Version, da sie nach der Veröffentlichung veröffentlicht wurde.
In diesem Fall sollten Sie das Maven-Compiler-Plugin so konfigurieren, dass es das JDK folgendermaßen angibt:

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

Du könntest mehr Details in Beispiele mit dem Maven Compiler Plugin haben.


Es wird nicht gefragt, aber in Fällen, in denen dies möglicherweise komplizierter ist, geben Sie Quelle, aber nicht Ziel an. Je nach Quellversion wird möglicherweise eine andere Version im Ziel verwendet. Regeln sind besonders wichtig: Sie können sie in Teil Cross-Compilation Options nachlesen.


Warum wird das Compiler-Plugin in der Ausgabe bei der Ausführung des Maven-Ziels package verfolgt, auch wenn Sie es nicht in der pom.xml angeben?

Um Ihren Code zu kompilieren und allgemeiner alle für ein Maven-Ziel erforderlichen Aufgaben auszuführen, benötigt Maven Tools. Es verwendet also Core-Maven-Plugins (Sie erkennen ein Core-Maven-Plugin an seinem groupId: org.Apache.maven.plugins), Um die erforderlichen Aufgaben auszuführen: Compiler-Plugin zum Kompilieren von Klassen, Test-Plugin zum Ausführen von Tests und so weiter for ... Selbst wenn Sie diese Plugins nicht deklarieren, sind sie an die Ausführung des Maven-Lebenszyklus gebunden.
Im Stammverzeichnis Ihres Maven-Projekts können Sie den folgenden Befehl ausführen: mvn help:effective-pom, Um den endgültigen POM effektiv zu verwenden. Sie können unter anderem angehängte Plugins von Maven (angegeben oder nicht in Ihrer pom.xml) mit der verwendeten Version, ihrer Konfiguration und den ausgeführten Zielen für jede Phase des Lebenszyklus anzeigen.

In der Ausgabe des Befehls mvn help:effective-pom Können Sie die Deklaration dieser Kern-Plugins im Element <build><plugins> Sehen, 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 dazu finden Sie in die Einführung des Maven-Rettungsschwimmers in der Maven-Dokumentation .

Trotzdem können Sie diese Plugins deklarieren, wenn Sie sie mit anderen Werten als Standardwerte konfigurieren möchten (zum Beispiel, wenn Sie das Maven-Compiler-Plugin in Ihrer pom.xml deklariert haben, um die zu verwendende JDK-Version anzupassen) oder wenn Sie möchte einige Plugin-Ausführungen hinzufügen, die standardmäßig nicht im Maven-Lebenszyklus verwendet werden.

232
davidxxx

Keine der oben genannten Lösungen funktionierte für mich sofort. Also habe ich folgendes gemacht: -

  1. Hinzugefügt

    <properties> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.source>1.8</maven.compiler.source> </properties>

    in pom.xml

  2. Ging zum Projekt Properties> Java Build Path und entfernte dann die JRE Systembibliothek, die auf JRE1.5 verweist.

  3. Aktualisierte das Projekt.

0
Sen

Betrachten Sie die Alternative:

<properties>
    <javac.src.version>1.8</javac.src.version>
    <javac.target.version>1.8</javac.target.version>
</properties>

Es sollte dasselbe von maven.compiler.source/maven.compiler.target sein, aber die obige Lösung funktioniert für mich, ansonsten erhält die zweite die übergeordnete Spezifikation (ich habe eine Matrioska von .pom)

0
Stefano