Comment spécifier la version du JDK?
1) <java.version>
n'est pas référencé dans le Maven de la documentation.
C'est un Printemps de Démarrage de la spécificité.
Il permet de définir la source et la cible de la version java avec la même version comme celui-ci pour spécifier java 1.8 pour les deux :
<properties>
<java.version>1.8</java.version>
</properties>
N'hésitez pas à utiliser si vous utilisez le Printemps de Démarrage.
2) à l'Aide d' maven-compiler-plugin
ou maven.compiler.source
/maven.compiler.target
propriétés pour spécifier l' source
et de la 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 l'équivalent selon le Maven de la documentation du compilateur plugin
depuis l' <source>
et de la <target>
éléments dans le compilateur de configuration utiliser les propriétés maven.compiler.source
et maven.compiler.target
si ils sont définis.
source
L' -source
argument pour le compilateur Java.
La valeur par défaut est: 1.6
.
Propriété de l'utilisateur est: maven.compiler.source
.
cible
L' -target
argument pour le compilateur Java.
La valeur par défaut est: 1.6
.
Propriété de l'utilisateur est: maven.compiler.target
.
Sur les valeurs par défaut pour source
et target
, note que
depuis l' 3.8.0
de la maven compilateur, les valeurs par défaut ont changé d' 1.5
de 1.6
.
3) Le 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 à ce moment, il ne fonctionnera pas comme l' maven-compiler-plugin
par défaut de la version que vous utilisez ne repose pas sur un assez récente version.
Le Maven release
argument transmet release
: une 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
spécifique VM version.
De cette façon, fournit un moyen standard pour spécifier la même version de l' source
, target
et de la bootstrap
de la JVM des options.
Notez que la définition de l' bootstrap
est une bonne pratique pour traverser les compilations et il ne fera pas mal si vous n'avez pas à faire des compilations.
Qui est le meilleur moyen de spécifier la version du JDK?
Le premier moyen (<java.version>
) est autorisé uniquement si vous utilisez le Printemps de Démarrage.
Pour Java 8 et ci-dessous :
Sur les deux autres moyens : la valorisation de l' maven.compiler.source
/maven.compiler.target
propriétés ou à l'aide de l' maven-compiler-plugin
, vous pouvez utiliser l'un ou l'autre. Cela ne change rien dans les faits puisque finalement les deux solutions se basent sur les mêmes propriétés et le même mécanisme : le maven de base compilateur plugin.
Eh bien, si vous n'avez pas besoin de spécifier d'autres propriétés ou de comportement que les versions de Java dans le compilateur plugin, l'utilisation de cette voie a plus de sens que ce n'est plus concise:
<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 une voie à 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?
Il n'est pas un problème si le JDK référencé par l' JAVA_HOME
est compatible avec la version spécifiée dans le pom, mais afin d'assurer une meilleure cross-compilation de compatibilité pensez à ajouter l' bootstrap
de la JVM de l'option avec comme valeur le chemin d'accès de l' rt.jar
de la target
version.
Une chose importante à considérer est que l' source
et de la target
version de Maven configuration ne doit pas être supérieure à la version du JDK référencé par l' JAVA_HOME
.
Une ancienne version du JDK ne peut pas compiler avec une version plus récente puisqu'elle ne connaît pas son cahier des charges.
Pour obtenir des informations sur la source, la cible et la libération des versions prises en charge selon le JDK utilisé, reportez-vous à la java compilation : la source, la cible et la libération des versions prises en charge.
Comment gérer le cas de JDK référencé par le JAVA_HOME n'est pas compatible avec le java cible et/ou de la source des versions spécifiées dans le pom?
Par exemple, si votre JAVA_HOME
se réfère à un JDK 1.7 et que vous spécifiez un JDK 1,8 source et la cible dans le compilateur de la configuration de votre pom.xml il va être un problème, car comme expliqué, le JDK 1.7 ne sais pas comment compiler avec.
De son point de vue, il est un inconnu de la version du JDK depuis qu'il a été libéré après.
Dans ce cas, vous devez configurer le Maven compilateur plugin 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 les exemples avec maven compilateur plugin.
Il n'est pas demandé, mais les cas qui peut être plus compliqué, c'est lorsque vous spécifiez la source, mais pas de cible. Il peut utiliser une version différente dans la cible en fonction de la version d'origine. Les règles sont notamment : vous pouvez lire à leur sujet dans la Cross-Compilation des Options de la partie.
Pourquoi le compilateur plugin est tracé dans la sortie à l'exécution de Maven package
objectif, même si vous n'avez pas le spécifier dans l'pom.xml?
Pour compiler votre code et, plus généralement, d'effectuer toutes les tâches requises pour une maven objectif, Maven a besoin d'outils. Donc, il utilise les plugins Maven (vous reconnaître un core plugin Maven par ses groupId
: org.apache.maven.plugins
) pour effectuer les tâches requises : compilateur plugin pour la compilation des classes, plugin de test pour l'exécution des tests, etc... Donc, même si vous ne déclarez pas ces plugins, ils sont liés à l'exécution du cycle de vie de Maven.
À la racine de votre projet Maven, vous pouvez exécuter la commande : mvn help:effective-pom
pour obtenir la valeur finale pom utilisés efficacement. Vous avez pu le voir entre autres informations, attaché plugins Maven (déterminée ou non, dans votre pom.xml), avec la version utilisée, la configuration et l'exécution des objectifs pour chaque phase du cycle de vie.
Dans la sortie de l' mvn help:effective-pom
de commande, vous avez pu voir la déclaration de ces plugins 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 de l'Maven lifeycle dans le Maven de la documentation.
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 avez déclaré le maven-compiler le plugin dans votre pom.xml pour régler le JDK version à utiliser), ou lorsque vous souhaitez ajouter un plug-in non-exécution utilisée par défaut dans le cycle de vie de Maven.