Comment définir une version Java spécifique sur Maven

166

Sur ma machine, j'ai deux versions java installées: (1.6 et 1.7 installés manuellement par moi). J'ai besoin des deux pour différents projets. Mais pour Maven, j'ai besoin de 1.7, maintenant mon Maven utilise la version 1.6 java, comment puis-je configurer Maven pour utiliser 1.7?

etPat
la source
Je ne peux pas exporter JAVA_HOME avec java 1.7 car je ne peux pas toucher à la configuration de ma machine, la version par défaut de Java doit être 1.6.
etPat
Maven utilise JAVA_HOME donc ne pensez pas que ce que vous voulez faire est possible sans changer la valeur de JAVA_HOME.
Zyga
1
Utilisez-vous un IDE ou la ligne de commande? Êtes-vous sur un * nix ou Windows?
xwoker
1
Cette réponse couvre-t-elle ce que vous voulez? stackoverflow.com/a/4724062/1570834
DB5
Oui, c'est utile mais je ne peux pas faire de changements au pom du projet, néanmoins le truc est le même et la réponse est correcte
etPat

Réponses:

142

Maven utilise le JAVA_HOMEparamètre pour trouver la version Java qu'il est censé exécuter. Je vois de votre commentaire que vous ne pouvez pas changer cela dans la configuration.

  • Vous pouvez définir le JAVA_HOMEparamètre juste avant de démarrer maven (et le modifier ultérieurement si nécessaire).
  • Vous pouvez également aller dans votre mvn(non-windows) / mvn.bat/ mvn.cmd(windows) et y définir explicitement votre version java.
DanielBarbare
la source
29
@andPat: oui? Vous pouvez définir JAVA_HOMEdans votre shell local sans changer du tout la configuration de votre machine (dès que vous fermez ce shell, le changement est parti). Vous pouvez même le changer pour une seule commande:JAVA_HOME=/path/to/jdk17/ mvn build
Joachim Sauer
@JoachimSauer: Oui, mais j'avais également fait référence à mvn.bat, qui est spécifique à Windows.
DanielBarbarian
Sur mac, vous pouvez créer un fichier .mavenrc avec le JAVA_HOME à l'intérieur
Ronan Quillevere
Vieux, mais jetant dans mes 2 cents. Je travaille sur un service Java 8 appelé par une application Java 7. Pour éviter d'avoir à changer constamment lors de la construction, j'ai (sous Windows) créé une variable d'environnement MVN_JAVA_HOME, puis j'ai remplacé chaque occurrence de JAVA_HOME par MVN_JAVA_HOME dans mvn et mvn.cmd.
ryanlutgen
75

Dans le POM, vous pouvez définir les propriétés du compilateur, par exemple pour 1.8:

<project>
...
 <properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>
...
</project>
Edward Ross
la source
10
À partir de la version 3.7.0 du compilateur-plugin, les valeurs par défaut pour la source et la cible, si elles ne sont pas spécifiées, sont de 1,5
crowne
59

Ajout d'une solution pour les personnes avec plusieurs versions de Java installées

Nous avons une grande base de code, dont la plupart est en Java. La majorité de ce sur quoi je travaille est écrite en Java 1.7 ou 1.8. Puisque JAVA_HOMEc'est statique, j'ai créé des alias dans mon .bashrcpour exécuter Maven avec des valeurs différentes:

alias mvn5="JAVA_HOME=/usr/local/java5 && mvn"
alias mvn6="JAVA_HOME=/usr/local/java6 && mvn"
alias mvn7="JAVA_HOME=/usr/local/java7 && mvn"
alias mvn8="JAVA_HOME=/usr/local/java8 && mvn"

Cela me permet d'exécuter Maven à partir de la ligne de commande sur ma machine de développement, quelle que soit la version JDK utilisée sur le projet.

Jonathan Landrum
la source
2
À moins que vous n'ayez besoin de maven 2 et 3 pour divers projets, auquel cas vous avez déjà défini mvn2et mvn3défini et la dénomination devient un peu géniale lorsque les versions Java entrent également en jeu ...: D
Tomislav Nakic-Alfirevic
3
Si vous utilisez un Mac, votre JDK est livré avec la commande java_home afin que vous puissiez éviter les chemins de codage en dur, par exemplealias mvn8 = "JAVA_HOME=`/usr/libexec/java_home -v 1.8` && mvn
ptkvsk
5
Sur (ubuntu + bash), vous devez omettre l' &&avant mvn. mvn ne voit pas la valeur de JAVA_HOME avec &&.
Fabien
@Fabien bon à savoir; J'utilise ZSH et je ne connaissais pas les différences de Bash
Jonathan Landrum
47

Sur windows

Si vous ne souhaitez pas modifier votre JAVA_HOMEvariable dans les variables système.

Modifiez votre mvn.batfichier et ajoutez une ligne comme celle-ci

set JAVA_HOME=C:\Program Files\Java\jdk1.7.0_45\jre

Cela peut être fait après @REM ==== START VALIDATION ====comme mentionné par @Jonathan

Sur Mac (et Linux?)

Si vous ne souhaitez pas modifier votre JAVA_HOMEvariable dans votre ~/.bashrcou~/.bash_profile

vous pouvez créer un ~/.mavenrcfichier et le redéfinir JAVA_HOMEà l'aide de l' outil java_home

export JAVA_HOME=`/usr/libexec/java_home -v 1.7.0_45`

Verification sanitaire

Vous pouvez vérifier que tout fonctionne correctement en exécutant les commandes suivantes. La version jdk doit être différente.

mvn -version

puis

java -version

Ronan Quillevere
la source
Je l'ai configuré pour définir JAVA_HOME = C: \ Program Files \ Java \ jdk1.7.0_45 sous-dossier jre exclu.
nanosoft
32

Ajoutant mes deux cents et fournissant explicitement la solution.

J'ai deux JDK installés sur ma machine Windows - JDK 1.5et JDK 1.6.

Ma valeur par défaut (et définie sur la variable d'environnement système Windows) JAVA_HOMEest définie sur JDK 1.5.

Cependant, j'ai un projet maven que je dois construire (c'est-à-dire, Etsy.com de JBehave Tutorial ) en utilisant JDK 1.6.

Ma solution dans ce scénario (qui a fonctionné!), Est comme suggéré par @DanielBarbarianpour l'installer mvn.bat.

Pour certains qui ne sont pas familiers avec le fichier batch de window, j'ai simplement ajouté la set JAVA_HOME=<path_to_other_jdk>ligne après @REM ==== START VALIDATION ====in mvn.bat(ie, %MAVEN_HOME%\bin\mvn.bat):

@REM ==== START VALIDATION ====
set JAVA_HOME=C:\Program Files\Java\jdk1.6.0_45\jre
if not "%JAVA_HOME%" == "" goto OkJHome
Jonathan
la source
4
Dans maven 3.5, mvn.batest renommé en mvn.cmd.
CKM
30

Récemment, après sept longues années chez Maven, j'ai découvert toolchains.xml. Maven l'a même documenté et le prend en charge à partir de la version 2.0.9 - Documentation de la chaîne d'outils

J'ai donc ajouté un fichier toolchain.xml à mon dossier ~ / .m2 / avec le contenu suivant:

<toolchains xmlns="http://maven.apache.org/TOOLCHAINS/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/TOOLCHAINS/1.1.0 http://maven.apache.org/xsd/toolchains-1.1.0.xsd">
 <!-- JDK toolchains -->
 <toolchain>
   <type>jdk</type>
   <provides>
     <version>1.8</version>
     <vendor>sun</vendor>
   </provides>
   <configuration>
     <jdkHome>/opt/java8</jdkHome>
   </configuration>
 </toolchain>
 <toolchain>
   <type>jdk</type>
   <provides>
     <version>1.7</version>
     <vendor>sun</vendor>
   </provides>
   <configuration>
     <jdkHome>/opt/java7</jdkHome>
   </configuration>
 </toolchain>
</toolchains>

Il vous permet de définir les différents JDK que Maven peut utiliser pour créer le projet, quel que soit le JDK avec lequel Maven s'exécute. Un peu comme lorsque vous définissez JDK au niveau du projet dans l'EDI.

Ondrej Burkert
la source
2
La meilleure réponse,! Merci. Cela explique une situation claire où nous voulons exécuter Maven et le projet en cours de compilation avec deux runtimes / framework java différents.
Soundararajan
5

Une solution simple au problème -

JAVA_HOME = / usr / lib / jvm / java-6-sun / mvn installation propre

Sur Mac, cela ressemblerait à quelque chose comme -

JAVA_HOME = / Bibliothèque / Java / JavaVirtualMachines / jdk1.7.0_21.jdk / Contents / Home / mvn clean install

PS: Un cas particulier que j'ai trouvé est que la commande ci-dessus ne fonctionne pas sur la coquille de «poisson». J'avais aussi un shell bash disponible et cela fonctionnait bien là-bas. utilisez simplement la commande 'bash' pour passer au shell bash.

Pankaj
la source
5

Vous pouvez configurer des sources de compilation en utilisant différents JDK avecmaven-compiler-plugin .

Spécifiez simplement le chemin vers javacdans la <executable>balise. Par exemple, pour java11, cela ressemble à:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
        <source>11</source>
        <target>11</target>
        <fork>true</fork>
        <executable>C:\Program Files\Java\jdk-11.0.1\bin\javac</executable> <!--PATH TO JAVAC -->
    </configuration>
</plugin>
Ruslan
la source
5

Sans modifier les variables d'environnement, vous pouvez gérer la version java en fonction du niveau du projet à l'aide du plug-in Maven Compiler.

Méthode 1

<properties>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
</properties>
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Méthode 2

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
    </plugins>
</build>
Saveendra Ekanayake
la source
4

Pour éviter tout impact sur votre projet et vos variables d'environnement, vous pouvez configurer le plugin Maven Compiler uniquement sur le POM du projet, en spécifiant la version java source et cible

  <plugins>
    <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.5.1</version>
        <configuration>
            <source>1.7</source>
            <target>1.7</target>
        </configuration>
    </plugin>
    ...
  </plugins>
Tonino
la source
4

Vous pouvez configurer Maven pour utiliser n'importe quelle version Java en suivant les instructions ci-dessous.

Installez jenv dans votre lien machine

Vérifiez les versions java disponibles installées sur votre machine en exécutant la commande suivante en ligne de commande.

versions de jenv

Vous pouvez spécifier la version globale de Java à l'aide de la commande suivante.

jenv global oracle64-1.6.0.39

Vous pouvez spécifier la version Java locale pour n'importe quel répertoire (Projet) à l'aide de la commande suivante dans le répertoire en ligne de commande.

jenv local oracle64-1.7.0.11

ajoutez la bonne version Java dans votre pom.xml

si vous exécutez maven en ligne de commande, installez le plugin jenv maven en utilisant la commande ci-dessous

jenv enable-plugin maven

Vous pouvez maintenant configurer n'importe quelle version Java de votre machine sur n'importe quel projet sans aucun problème.

Ranuka
la source
1
comme cette option. jenv est comme virtualenv pour python
Jesse Zhuang
4

Sur Mac, (en supposant que vous ayez la bonne version installée)

JAVA_HOME=`/usr/libexec/java_home -v 1.8` mvn clean install -DskipTests

user2475448
la source
2

Sous Windows, j'ajoute simplement plusieurs fichiers de commandes pour différentes versions de JDK au dossier bin Maven comme ceci:

mvn11.cmd

@echo off
setlocal
set "JAVA_HOME=path\to\jdk11"
set "path=%JAVA_HOME%;%path%"
mvn %*

alors vous pouvez utiliser mvn11pour exécuter Maven dans le JDK spécifié.

Guo Ferrell
la source
1

Je n'ai pas eu de succès sur mac avec juste un réglage JAVA_HOMEdans la console mais j'ai réussi avec cette approche

  • Créez un fichier .mavenrc dans votre répertoire personnel (le chemin du fichier sera donc ~/.mavenrc
  • Dans ce fichier coller export JAVA_HOME=$(/usr/libexec/java_home -v 1.7)
Martin Vich
la source
0

Vous pouvez également installer deux versions de maven et modifier l' une d'entre elles, en modifiant ici:

mvn (non-windows) /mvn.bat/mvn.cmd (windows)

en remplaçant vos apparences% java_home% par le chemin java souhaité. Ensuite, exécutez simplement maven à partir de ce chemin modifié

Alberto Perez
la source