Spécifiez le JDK à utiliser par Maven

141

J'essaie de créer un plugin Hudson que j'ai modifié et il nécessite jdk1.6. C'est bien, mais je ne vois pas comment je peux dire à maven où se trouvent les différents jdk. J'ai trouvé quelques mentions sur Internet mais elles ne semblent pas s'appliquer à moi. Certains suggèrent d'ajouter une configuration .m2/settings.xmlmais je n'ai pas de fichier settings.xml. De plus, je ne veux pas utiliser 1.6 pour toutes les versions de maven.

Un problème est que j'utilise mvndans cygwin, si cela compte. Il semble que je devrais être capable de faire la spécification dans le fichier pom du projet, mais le pom existant est assez nu.

Donc, en fin de compte, existe-t-il un moyen de spécifier un jdk pour une seule invocation de maven?

DanInDC
la source

Réponses:

142

Donc, en fin de compte, existe-t-il un moyen de spécifier un jdk pour une seule invocation de maven?

Modifiez temporairement la valeur de votre JAVA_HOMEvariable d'environnement.

Pascal Thivent
la source
10
Exemple sous Windows:set JAVA_HOME="C:\Java\jdk7"
acdcjunior
6
dans lubuntu: JAVA_HOME = "/ home / desa / programas / jdks / jdk1.6.0_45 /" mvn -v
Enrique San Martín
8
Et au cas où quelqu'un d'autre oublie et passe des siècles à se demander pourquoi il ne peut pas le changer: JAVA_HOMEpeut être défini pour Maven (sur Mac au moins) dans ce fichier: /private/etc/mavenrc - Et cela peut utiliser quelque chose comme (notez les backticks pas des guillemets simples!):export JAVA_HOME=`/usr/libexec/java_home -v 1.7.0_75`
RedYeti
3
Unix: export JAVA_HOME='D:/dev/java/jdk8/jre'(fonctionne pour moi)
Christophe Roussy
2
si je change JAVA_HOME et que je le fais java -version, il imprime toujours la version précédente.
ocramot
82

Il semble que maven donne maintenant une solution ici: Compilation de sources à l'aide d'un JDK différent

Disons que vos JAVA_HOMEpoints sur JDK7 (qui exécutera les processus maven)

Votre pom.xmlpourrait être:

<build>
    <plugins>
        <!-- we want JDK 1.6 source and binary compatiblility -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>
        <!-- ... -->
        <!-- we want sources to be processed by a specific 1.6 javac -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
              <verbose>true</verbose>
              <fork>true</fork>
              <executable>${JAVA_1_6_HOME}/bin/javac</executable>
              <compilerVersion>1.3</compilerVersion>
            </configuration>
        </plugin>
    </plugins>
</build>

Si vos développeurs ajoutent (et personnalisent) simplement les lignes suivantes dans leur settings.xml, votre pom sera indépendant de la plateforme:

<settings>
  [...]
  <profiles>
    [...]
    <profile>
      <id>compiler</id>
        <properties>
          <JAVA_1_4_HOME>C:\Program Files\Java\j2sdk1.4.2_09</JAVA_1_4_HOME>
          <JAVA_1_6_HOME>C:\Program Files\Java\j2sdk1.6.0_18</JAVA_1_6_HOME>
        </properties>
    </profile>
  </profiles>
  [...]
  <activeProfiles>
    <activeProfile>compiler</activeProfile>
  </activeProfiles>
</settings>
Cerber
la source
18
Voté! J'ai trouvé que je peux utiliser -Dmaven.compiler.fork=trueet -Dmaven.compiler.executable=/path/to/target/javacen ligne de commande.
Jin Kwon
même en utilisant ces java-opts, vous devez toujours l'ajouter au plugin du compilateur <executable> $ {maven.compiler.executable} </executable>
Paul Gregoire
2
@JinKwon Passer des options avec -D fonctionne bien, même sans le définir dans la section plugin du compilateur. C'est bien pour une utilisation occasionnelle ou pour la création de scripts. Vous devriez le mettre dans une réponse distincte afin que nous puissions voter!
Gaëtan Lehmann
Cette solution a échoué lorsque j'essaye d'exécuter des tests dans Java 8 J'obtenais * Version majeure.minor non prise en charge 52.0 *
edwin
39

compile: compile a une propriété utilisateur qui vous permet de spécifier un chemin vers lejavac .

Notez que cette propriété utilisateur ne fonctionne que lorsque forkc'est truequi est falsepar défaut.

$ mvn -Dmaven.compiler.fork=true -Dmaven.compiler.executable=/path/to/the/javac compile

Vous devrez peut-être double guillemet la valeur si elle contient des espaces.

> mvn -Dmaven.compiler.fork=true -Dmaven.compiler.executable="C:\...\javac" compile

Voir aussi Priorité des propriétés personnalisées Maven .

Jin Kwon
la source
J'ai également eu besoin d'écraser ma JAVA_HOMEvariable. Par exemple (en bash shell):JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/ mvn -Dmaven.compiler.fork=true -Dmaven.compiler.executable=/usr/lib/jvm/java-8-openjdk-amd64/bin/javac spring-boot:run
Enrique S. Filiage
24

Comme vous l'avez dit: "De plus, je ne veux pas utiliser 1.6 pour toutes les versions de maven." .... Donc mieux je dirai de modifier votre fichier pom et de spécifier la version de jdk à utiliser.

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
                <source>1.9</source>
                <target>1.9</target>
            </configuration>
        </plugin>
    </plugins>
</build>

Cela garantira que votre projet particulier utilise cette version de jdk.

DevCoder
la source
6
Ce n'est que le point de départ, mais pas la solution. C'est la condition requise pour que le plugin maven compilateur compile pour 1.7. Et puis l'astuce est de rendre maven vraiment capable de compiler pour 1.7, ce qui n'est pas si trivial si votre version java actuelle est différente ...
Sergey Ushakov
C'est une autre question stackoverflow.com/questions/16723533/…
Paul Verest
14

Je dis que vous configurez la JAVA_HOMEvariable d'environnement comme le dit Pascal: Dans Cygwin, si vous utilisez bash comme votre shell devrait être:

export JAVA_HOME=/cygdrive/c/pathtothejdk

Cela ne nuit jamais à ajouter également le binchemin du répertoire java à la PATHvariable d'environnement avec:

export PATH=${JAVA_HOME}/bin:${PATH}

Ajoutez également maven-enforce-pluginpour vous assurer que le bon JDK est utilisé. C'est une bonne pratique pour votre pom.

<build>
 <plugins>
   <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-enforcer-plugin</artifactId>
      <executions>
        <execution>
          <id>enforce-versions</id>
          <goals>
            <goal>enforce</goal>
          </goals>
          <configuration>
            <rules>
              <requireJavaVersion>
                <version>1.6</version>
              </requireJavaVersion>
            </rules>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

Veuillez consulter le plugin Maven Enforcer - Utilisation .

feniix
la source
1
C'était parfait pour spécifier la version exacte du JDK. Par exemple, j'ai un projet qui échoue lors de l'utilisation du JDK 1.8 initial, mais si vous utilisez JDK 1.8.0_77, cela fonctionne très bien. J'avais les deux JDK installés, et avec cette solution, maven m'a dit que j'utilisais la mauvaise version de 1.8 jusqu'à ce que je change mon chemin JAVA_HOME pour cibler le dossier spécifique 1.8.0_77. Les autres réponses ne vous ont pas permis d'être aussi précis sur la version.
bojingo
13

Je sais que c'est un vieux fil. Mais j'avais des problèmes avec quelque chose de similaire dans la source du compilateur Maven pour Java 8. J'ai compris cela avec une solution rapide mentionnée dans cet article , je pensais pouvoir la mettre ici et peut-être aider les autres:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>
Parth Joshi
la source
1
Une mise à jour Maven peut être nécessaire après l'ajout de ces lignes (Eclipse: clic droit sur le projet, Maven, projet de mise à jour)
Romano
La définition des propriétés maven.compiler n'empêche pas le code d'utiliser les méthodes ajoutées dans java 11. Pour les instances String.repeat (). Ceci lors de la construction avec jdk 11. Donc, le maven construit mais je souhaite qu'il échoue
Enrico Giurin
6

Maven utilise la variable $ JAVACMD comme commande java finale, définissez-la à l'endroit où se trouve l'exécutable java pour basculer maven vers un JDK différent.

Lin Gao
la source
Merci mon pote, après avoir passé 10 heures, nous avons réparé avec l'aide de votre réponse.
Mukul_3062
3

Hudson vous permet également de définir plusieurs environnements d'exécution Java et d'appeler Maven avec l'un d'entre eux. Regardez de plus près sur la page de configuration.

Thorbjørn Ravn Andersen
la source
L'OP construit un plugin hudson sur la ligne de commande, pas sous hudson (du moins, c'est ce que je comprends).
Pascal Thivent
3

Si vous avez installé Java via brewen Macalors les chances sont que vous trouverez votre Java Home Directory ici:

/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

La prochaine étape serait maintenant de trouver le Java Homerépertoire vers lequel maven pointe. Pour le trouver, tapez la commande:
mvn -version

entrez la description de l'image ici

Les domaines qui nous intéressent ici sont: Java versionetruntime .

Maven pointe actuellement du doigt Java 13. En outre, vous pouvez voir le chemin d'accès Java Home sous l'exécution de la clé, qui est:
/usr/local/Cellar/openjdk/13.0.2+8_2/libexec/openjdk.jdk/Contents/Home

Pour changer la version Java du maven, nous devons ajouter le Java 8chemin d'accès personnel auJAVA_HOME variable env.

Pour ce faire, nous devons exécuter la commande:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home dans le terminal.

Maintenant, si nous vérifions la version maven, nous pouvons voir qu'elle pointe maintenant vers Java 8.

entrez la description de l'image ici

Le problème avec ceci est que si vous vérifiez à nouveau la version de maven dans le nouveau terminal, vous constaterez qu'elle pointe vers le Java 13. Pour éviter cela, je suggère d'ajouter la JAVA_HOMEvariable dans le~/.profile fichier.

De cette façon, chaque fois que votre terminal se charge, il reprendra la valeur que vous avez définie dans JAVA_HOME par défaut. Voici la ligne que vous devez ajouter dans le ~/.profilefichier:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

Vous pouvez ouvrir un nouveau terminal et vérifier la version de Maven, ( mvn -version) et vous verrez qu'il pointe vers Java 8 cette fois.

Rito
la source
0

J'ai eu un problème de construction avec maven dans Eclipse sous Windows 7.

Bien que j'aie observé que mvn build fonctionnait très bien à partir de la ligne de commande.

mvn -T 5 -B -e -X -U -P test clean install -Dmaven.surefire.debug  --settings ..\..\infra-scripts\maven-conf\settings.xml   > output.log

Eclipse considérait comme JVM par défaut une installation JRE au lieu de JDK, elle échouait donc lors de la compilation.

J'ai ajouté à eclipse.ini la ligne suivante:

-vm
C:\Program Files (x86)\Java\jdk1.8.0_25\bin

Aussi lors du démarrage de eclipse, j'ai utilisé dans la section "Objectifs" la liste suivante:

-T 5 -B -e -X -U -P test clean install -Dmaven.surefire.debug  --settings ..\..\infra-scripts\maven-conf\settings.xml

Une erreur de compilation a été résolue.

aprodan
la source
0

Pour Java 9:

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
                <source>9</source>
                <target>9</target>
            </configuration>
        </plugin>
    </plugins>
</build>
Jobanpreet Singh
la source
0

Une autre alternative pour gérer plusieurs versions de jdk est jEnv

Après l'installation, vous pouvez simplement changer la version java "localement" c'est-à-dire pour un répertoire de projet spécifique en:

jenv local 1.6

Cela permettra également à mvn d'utiliser cette version localement, lorsque vous activez le plugin mvn:

jenv enable-plugin maven
Ahmad Abdelghany
la source
0

Vous pouvez également définir le JDK pour Maven dans un fichier de votre répertoire personnel ~/.mavenrc:

JAVA_HOME='/Library/Java/JavaVirtualMachines/jdk-11.0.5.jdk/Contents/Home'

Cette variable d'environnement sera vérifiée par le script mvn et utilisée lorsqu'elle est présente:

  if [ -f "$HOME/.mavenrc" ] ; then
    . "$HOME/.mavenrc"
  fi

https://github.com/CodeFX-org/mvn-java-9/tree/master/mavenrc

Spindizzy
la source