Spécification de la version java dans maven-différences entre les propriétés et le plugin de compilation

Je ne suis pas très expérimenté avec maven et en expérimentant avec le projet multi-modules, j'ai commencé à me demander comment je peux spécifier la version java pour tous les modules de mon enfant dans parent maven pom. Jusqu'à aujourd'hui j'utilisais juste:

<properties>
    <java.version>1.8</java.version>
</properties>

mais lors de la recherche j'ai trouvé que vous pouvez également spécifier la version java dans le plugin de compilateur maven, comme cela:

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

et ensuite envelopper ceci dans une étiquette de gestion de plugin pour permettre aux enfants de l'utiliser. Donc la première question Est quelles sont les différences beetwen paramétrant la version java dans les propriétés et dans le plugin de compilateur maven?

Je n'ai pas pu trouver de réponse claire mais en cours de recherche j'ai trouvé que vous pouvez également spécifier la version java de cette façon:

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

qui suggèrent que le plugin de compilateur est là même si Je ne le déclare pas explicitement. Exécution des sorties du paquet mvn avec

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

et d'autres plugins que je n'ai pas déclarés. est-ce que ces plugins par défaut font partie cachée de maven pom? Y a-t-il des différences entre les paramètres de beetwen source/cible dans les propriétés et dans l'élément de configuration du plugin maven?

D'autres questions sont - de quelle manière utiliser (et quand si elles ne sont pas égales)? Lequel est le meilleur pour le projet multi-modules et que se passe-t-il si la version java spécifiée dans pom est différente de la version pointée dans JAVA_HOME?

90
demandé sur Gray 2016-08-10 22:35:44

2 réponses

comment spécifier la version JDK?

1) <java.version> n'est pas référencé dans le Maven de la documentation.

C'est une spécificité de Botte de printemps.

Il permet de définir la source et la version java cible avec la même version comme celle-ci pour spécifier java 1.8 pour les deux:

<properties>
     <java.version>1.8</java.version>
</properties>   

N'hésitez pas à l'utiliser si vous utilisez une botte à ressort.

2) L'utilisation des propriétés maven-compiler-plugin ou maven.compiler.source / maven.compiler.target pour spécifier les propriétés source et target sont équivalentes.

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

et

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

sont équivalents selon la Maven documentation du plugin de compilateur comme les éléments <source> et <target> de la configuration du compilateur utilisent les propriétés maven.compiler.source et maven.compiler.target s'ils sont définis.

source

l'argument -source pour le compilateur Java.

La valeur par défaut est: 1.6 .

La propriété de l'utilisateur est: maven.compiler.source .

cible

Le -target l'argument pour le compilateur Java.

La valeur par défaut est: 1.6 .

La propriété de l'utilisateur est: maven.compiler.target .

concernant les valeurs par défaut pour source et target , notez que depuis le 3.8.0 du compilateur maven, les valeurs par défaut ont changé de 1.5 à 1.6 .

3) le maven-compilateur-plugin 3.6 et les versions suivantes fournissent une nouvelle voie:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
        <release>9</release>
    </configuration>
</plugin>

vous pouvez aussi déclarer juste:

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

mais à ce moment-ci, il ne fonctionnera pas car la version par défaut maven-compiler-plugin que vous utilisez ne repose pas sur une version assez récente.

Maven "1519310920 argument de" véhicule release : un nouvelle JVM standard option que nous avons pu passer de Java 9 :

Compile contre le public, pris en charge et API documentée pour un version VM spécifique.

fournit ainsi une méthode standard pour spécifier la même version pour les options JVM source , target et bootstrap .

Notez que spécifier le bootstrap est une bonne pratique pour les compilations croisées et cela ne fera pas de mal si vous ne faites pas de compilations croisées non plus.


Quelle est la meilleure façon de spécifier la version JDK?

la première voie ( <java.version> ) n'est autorisée que si vous utilisez une botte à ressort.

Pour Java 8 et ci-dessous :

à propos des deux autres façons : en évaluant les maven.compiler.source / maven.compiler.target propriétés ou en utilisant le maven-compiler-plugin , vous pouvez utiliser l'un ou l'autre. Il change rien dans les faits puisque finalement les deux solutions reposent sur les mêmes propriétés et le même mécanisme : le plugin de compilateur maven core.

Eh bien, si vous n'avez pas besoin de spécifier d'autres propriétés ou comportements que les versions Java dans le plugin de compilateur, en utilisant cette façon fait plus de sens que ce qui est plus concis:

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

De Java 9:

l'argument release ( troisième point) est un de manière à envisager sérieusement si vous voulez utiliser la même version pour la source et la cible.

Qu'advient-il si la version est différente entre le JDK JAVA_HOME et qui celui spécifié dans le pom.xml?

ce n'est pas un problème si le JDK référencé par le JAVA_HOME est compatible avec la version spécifiée dans le pom mais pour assurer une meilleure compatibilité de compilation croisée pensez à ajouter le bootstrap JVM option avec comme valeur le chemin du rt.jar de la version target .

une chose importante à considérer est que la version source et la version target dans la configuration Maven ne devrait pas être supérieure à la version JDK référencée par le JAVA_HOME .

Une ancienne version du JDK ne peut pas être compilée avec une version plus récente puisqu'elle ne connaît pas ses spécifications.

pour obtenir des informations en ce qui concerne les versions supportées par la source, la cible et la publication selon le JDK utilisé, s'il vous plaît se référer à Java compilation : source, la cible et les versions supportées par la publication .


comment gérer le cas de JDK référencé par le JAVA_HOME n'est pas compatible avec les versions java target et/ou source spécifiées dans le pom?

par exemple, si votre JAVA_HOME JDK 1.7 et vous spécifiez un JDK 1.8 comme source et cible dans la configuration du compilateur de votre pom.xml, ce sera un problème car comme expliqué, le JDK 1.7 ne sait pas compiler avec.

De son point de vue, C'est une version JDK inconnue puisqu'elle est sortie après elle.

Dans ce cas, vous devez configurer le plugin du compilateur Maven pour spécifier le JDK de cette façon:

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

Vous pourriez avoir plus de détails dans exemples avec maven compilateur plugin .


il n'est pas demandé, mais les cas où cela peut être plus compliqué est quand vous spécifiez source mais pas de cible. Il peut utiliser une version différente de target selon la version source. Les règles sont particulières : vous pouvez les lire dans la section des options de Compilation croisée .


Pourquoi le plugin de compilateur est tracé dans la sortie à l'exécution du Maven package but même si vous ne le spécifiez pas dans le pom.xml?

pour compiler votre code et plus généralement pour effectuer toutes les tâches requises pour un but maven, Maven a besoin d'outils. Ainsi, il utilise des plugins core Maven (vous reconnaissez un plugin core Maven par son groupId : org.apache.maven.plugins ) pour faire les tâches requises: plugin de compilateur pour compiler des classes, plugin de test pour exécuter des tests, et donc, pour... Donc, même si vous ne déclarez pas ces plugins, ils sont liés à l'exécution du cycle de vie Maven.

À la racine de votre projet Maven, vous pouvez exécuter la commande : mvn help:effective-pom pour obtenir le pom final efficacement utilisé. Vous pouvez voir entre autres informations, les plugins attachés par Maven (spécifiés ou non dans votre pom.xml), avec la version utilisée, leur configuration et les objectifs exécutés pour chaque phase du cycle de vie.

In la sortie de la commande mvn help:effective-pom , vous pouvez voir la déclaration de ces plugins de base dans l'élément <build><plugins> , par exemple:

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

vous pouvez avoir plus d'informations à ce sujet dans l'introduction du cycle de vie Maven dans la documentation Maven .

Néanmoins, vous pouvez déclarer ces plugins lorsque vous souhaitez configurer avec d'autres valeurs que les valeurs par défaut (par exemple, vous l'avez fait quand vous déclaré le plugin maven-compiler dans votre pom.xml pour ajuster la version JDK à utiliser) ou quand vous voulez ajouter des exécutions de plugin non utilisées par défaut dans le cycle de vie Maven.

153
répondu davidxxx 2018-08-27 10:19:20
"151920920 Considérer" l'alternative:

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

il devrait être la même chose de maven.compiler.source/maven.compiler.target mais la solution ci-dessus fonctionne pour moi, sinon la seconde obtient la spécification parente (j'ai une matrioska de .pom)

0
répondu Stefano 2018-06-13 09:51:13