Comment spécifier la version JDK?
1) <java.version>
n'est pas référencé dans la documentation Maven.
C'est une spécificité de Spring Boot.
Il permet de définir la version java source et cible avec la même version telle que 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 Spring Boot.
2) En utilisant maven-compiler-plugin
ou maven.compiler.source
/ maven.compiler.target
properties pour spécifier les source
et les target
sont équivalents.
<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 documentation Maven du plugin du compilateur
puisque <source>
les <target>
éléments et dans la configuration du compilateur utilisent les propriétés maven.compiler.source
et maven.compiler.target
si elles sont définies.
la source
L' -source
argument du compilateur Java.
Valeur par défaut est: 1.6
.
Propriété de l' utilisateur est: maven.compiler.source
.
cible
L' -target
argument du compilateur Java.
Valeur par défaut est: 1.6
.
Propriété de l' utilisateur est: maven.compiler.target
.
À propos des valeurs par défaut pour source
et target
, notez que
depuis le 3.8.0
compilateur maven, les valeurs par défaut sont passées de 1.5
à1.6
.
3) Le plugin maven-compiler-plugin 3.6
et les versions ultérieures offrent une nouvelle façon:
<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 également déclarer simplement:
<properties>
<maven.compiler.release>9</maven.compiler.release>
</properties>
Mais pour le moment, cela ne fonctionnera pas car le maven-compiler-plugin
version par défaut que vous utilisez ne repose pas sur une version suffisamment récente.
L' release
argument Maven véhicule release
: une nouvelle option standard JVM que nous pourrions passer de Java 9:
Compile avec l'API publique, prise en charge et documentée pour une version de machine virtuelle spécifique.
Cette méthode fournit un moyen standard de spécifier la même version pour les options source
, les target
et les bootstrap
JVM.
Notez que spécifier le bootstrap
est une bonne pratique pour les compilations croisées et cela ne vous fera pas de mal si vous ne faites pas non plus de compilations croisées.
Quelle est la meilleure façon de spécifier la version JDK?
La première méthode ( <java.version>
) n'est autorisée que si vous utilisez Spring Boot.
Pour Java 8 et versions antérieures:
À propos des deux autres méthodes: valoriser les propriétés maven.compiler.source
/ ou utiliser lemaven.compiler.target
maven-compiler-plugin
, vous pouvez utiliser l'une ou l'autre. Cela ne 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 maven core compiler.
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 du compilateur, utiliser cette méthode a plus de sens car c'est plus concis:
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
À partir de Java 9:
L' release
argument (troisième point) est un moyen de considérer fortement si vous souhaitez utiliser la même version pour la source et la cible.
Que se passe-t-il si la version diffère entre le JDK dans JAVA_HOME et 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 l' bootstrap
option JVM avec comme valeur le chemin du rt.jar
de la target
version.
Une chose importante à considérer est que la source
et la target
version dans la configuration Maven ne doit pas être supérieure à la version JDK référencé par le JAVA_HOME
.
Une ancienne version du JDK ne peut pas être compilée avec une version plus récente car elle ne connaît pas sa spécification.
Pour obtenir des informations sur la source, la cible et la version des versions prises en charge en fonction du JDK utilisé, veuillez vous référer à la compilation java: versions prises en charge par la source, la cible et la version .
Comment gérer le cas du JDK référencé par le JAVA_HOME n'est pas compatible avec la cible java et / ou les versions source spécifiées dans le pom?
Par exemple, si votre JAVA_HOME
fait référence à un JDK 1.7 et que 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, il s'agit d'une version JDK inconnue puisqu'elle a été publiée après elle.
Dans ce cas, vous devez configurer le plugin du compilateur Maven pour spécifier le JDK de cette manière:
<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 des exemples avec le plugin de compilateur maven .
Ce n'est pas demandé, mais les cas où cela peut être plus compliqué sont lorsque vous spécifiez la source mais pas la cible. Il peut utiliser une version différente dans la cible selon la version source. Les règles sont particulières: vous pouvez les lire dans la partie Options de compilation croisée .
Pourquoi le plugin du compilateur est-il tracé dans la sortie lors de l'exécution de l' package
objectif Maven 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 nécessaires à un objectif maven, Maven a besoin d'outils. Ainsi, il utilise des plugins Maven noyau (vous reconnaissez un plugin Maven de base par son groupId
: org.apache.maven.plugins
) pour effectuer les tâches requises: plugin compilateur pour compiler les classes, plug - in de test pour l' exécution des tests, et donc pour ... Donc, même si vous ne le faites pas déclarez ces plugins, ils sont liés à l'exécution du cycle de vie Maven.
À la racine du répertoire de votre projet Maven, vous pouvez exécuter la commande: mvn help:effective-pom
pour que le pom final soit effectivement 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.
Dans la sortie de la mvn help:effective-pom
commande, vous pouvez voir la déclaration de ces plugins principaux dans l' <build><plugins>
élément, 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 les configurer avec d'autres valeurs comme valeurs par défaut (par exemple, vous l'avez fait lorsque vous avez déclaré le plugin maven-compiler dans votre pom.xml pour ajuster la version JDK à utiliser) ou lorsque vous souhaitez ajouter des exécutions de plugins non utilisées par défaut dans le cycle de vie de Maven.
<maven.compiler.x>
propriété à partir de maintenant.Aucune des solutions ci-dessus n'a fonctionné pour moi tout de suite. J'ai donc fait ce qui suit: -
Ajoutée
<properties> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.source>1.8</maven.compiler.source> </properties>
dans pom.xml
Je suis allé au
Project Properties > Java Build Path
, puis j'ai supprimé la bibliothèque système JRE qui pointait versJRE1.5
.Force a mis à jour le projet.
la source
Considérez l'alternative:
Cela devrait être la même chose
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)la source