So stellen Sie eine bestimmte Java-Version auf Maven ein

162

Auf meinem Computer sind zwei Java-Versionen installiert: (1.6 und 1.7 manuell von mir installiert). Ich brauche beide für verschiedene Projekte. Aber für Maven brauche ich 1.7, jetzt verwendet mein Maven die Java-Version 1.6. Wie kann ich Maven auf 1.7 einstellen?

andPat
quelle
Ich kann JAVA_HOME nicht mit Java 1.7 exportieren, da ich die Konfiguration meines Computers nicht berühren kann. Die Standardversion von Java muss 1.6 sein.
andPat
Maven verwendet JAVA_HOME. Denken Sie also nicht, dass das, was Sie tun möchten, möglich ist, ohne den JAVA_HOME-Wert zu ändern.
Zyga
1
Verwenden Sie eine IDE oder die Befehlszeile? Bist du auf einem * nix oder Windows?
Xwoker
1
Deckt diese Antwort ab, was Sie wollen? stackoverflow.com/a/4724062/1570834
DB5
Ja ist nützlich, aber ich kann keine Änderungen an POM des Projekts vornehmen, trotzdem ist das Zeug das gleiche und die Antwort ist richtig
Pat

Antworten:

137

Maven verwendet den JAVA_HOMEParameter, um herauszufinden, welche Java-Version ausgeführt werden soll. Ich sehe aus Ihrem Kommentar, dass Sie das in der Konfiguration nicht ändern können.

  • Sie können den JAVA_HOMEParameter unmittelbar vor dem Start von maven einstellen (und ihn gegebenenfalls später wieder ändern).
  • Sie können auch in Ihr mvn(Nicht-Windows) / mvn.bat/ mvn.cmd(Windows) gehen und dort Ihre Java-Version explizit festlegen.
DanielBarbarian
quelle
29
@andPat: also? Sie können JAVA_HOMEin Ihrer lokalen Shell festlegen, ohne die Konfiguration Ihres Computers zu ändern (sobald Sie diese Shell schließen, ist die Änderung weg). Sie können es sogar für einen einzelnen Befehl ändern:JAVA_HOME=/path/to/jdk17/ mvn build
Joachim Sauer
@ JoachimSauer: Ja, aber ich hatte auch einen Verweis auf mvn.bat gemacht, das Windows-spezifisch ist.
DanielBarbarian
Auf dem Mac können Sie eine .mavenrc-Datei mit JAVA_HOME erstellen
Ronan Quillevere
Alt, aber meine 2 Cent einwerfen. Ich arbeite an einem Java 8-Dienst, der von einer Java 7-Anwendung aufgerufen wird. Um zu vermeiden, dass beim Erstellen ständig gewechselt werden muss, habe ich (unter Windows) eine Umgebungsvariable MVN_JAVA_HOME erstellt und dann jedes Vorkommen von JAVA_HOME durch MVN_JAVA_HOME in mvn und mvn.cmd ersetzt.
Ryanlutgen
74

Im POM können Sie die Compilereigenschaften festlegen, z. B. für 1.8:

<project>
...
 <properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>
...
</project>
Edward Ross
quelle
9
Ab Compiler-Plugin Version 3.7.0 sind die Standardwerte für Quelle und Ziel, wenn sie nicht angegeben werden, 1,5
Crowne
58

Hinzufügen einer Lösung für Benutzer mit mehreren installierten Java-Versionen

Wir haben eine große Codebasis, die größtenteils in Java ist. Der Großteil meiner Arbeit ist entweder in Java 1.7 oder 1.8 geschrieben. Da JAVA_HOMEes statisch ist, habe ich in meinem Aliase Aliase erstellt, .bashrcum Maven mit verschiedenen Werten auszuführen:

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"

Auf diese Weise kann ich Maven über die Befehlszeile auf meinem Entwicklungscomputer ausführen, unabhängig von der im Projekt verwendeten JDK-Version.

Jonathan Landrum
quelle
2
Es sei denn, Sie benötigen Maven 2 und 3 für verschiedene Projekte. In diesem Fall haben Sie bereits mvn2und mvn3definiert und die Benennung wird ein bisschen funky, wenn auch Java-Versionen ins Spiel kommen ...: D
Tomislav Nakic-Alfirevic
3
Wenn Sie einen Mac verwenden, wird Ihr JDK mit dem Befehl java_home geliefert, damit Sie Hardcodierungspfade vermeiden können, z. B.alias mvn8 = "JAVA_HOME=`/usr/libexec/java_home -v 1.8` && mvn
ptkvsk
5
On (ubuntu + bash), müssen Sie das weglassen &&vor mvn. mvn sieht den Wert von JAVA_HOME mit nicht &&.
Fabien
@ Fabien gut zu wissen; Ich benutze ZSH und wusste nichts über die Bash-Unterschiede
Jonathan Landrum
47

Auf Fenstern

Wenn Sie Ihre JAVA_HOMEVariable innerhalb der Systemvariablen nicht ändern möchten .

Bearbeiten Sie Ihre mvn.batDatei und fügen Sie eine Zeile wie diese hinzu

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

Dies kann nach der @REM ==== START VALIDATION ====Erwähnung durch @Jonathan erfolgen

Auf Mac (& Linux?)

Wenn Sie Ihre JAVA_HOMEVariable in Ihrem ~/.bashrcoder nicht ändern möchten~/.bash_profile

Sie können eine ~/.mavenrcDatei erstellen und diese JAVA_HOMEmit dem Tool java_home neu definieren

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

Gesundheitsüberprüfung

Sie können überprüfen, ob alles einwandfrei funktioniert, indem Sie die folgenden Befehle ausführen. Die JDK-Version sollte anders sein.

mvn -version

dann

java -version

Ronan Quillevere
quelle
Ich habe es so eingestellt, dass JAVA_HOME = C: \ Programme \ Java \ jdk1.7.0_45 ausgeschlossen ist.
Nanosoft
32

Hinzufügen meiner zwei Cent und explizite Bereitstellung der Lösung.

Ich habe zwei JDKs auf meinem Windows-Computer installiert - JDK 1.5und JDK 1.6.

Meine Standardeinstellung (und auf Windows-Systemumgebungsvariable festgelegt) JAVA_HOMEist festgelegt JDK 1.5.

Ich habe jedoch ein Maven-Projekt, das ich erstellen muss (dh Etsy.com von JBehave Tutorial ) JDK 1.6.

Meine Lösung in diesem Szenario (die funktioniert hat!) Ist wie vorgeschlagen, um @DanielBarbariansie einzurichten mvn.bat.

Für einige, die mit der Batch-Datei von Windows nicht vertraut sind, habe ich einfach die set JAVA_HOME=<path_to_other_jdk>Zeile nach @REM ==== START VALIDATION ====in mvn.bat(dh %MAVEN_HOME%\bin\mvn.bat) hinzugefügt :

@REM ==== START VALIDATION ====
set JAVA_HOME=C:\Program Files\Java\jdk1.6.0_45\jre
if not "%JAVA_HOME%" == "" goto OkJHome
Jonathan
quelle
4
In maven 3.5 mvn.batwird in umbenannt mvn.cmd.
CKM
30

Ich habe erst kürzlich, nach sieben langen Jahren bei Maven, etwas über toolchains.xml gelernt. Maven hat es sogar dokumentiert und unterstützt es ab 2.0.9 - Toolchains-Dokumentation

Also habe ich meinem Ordner ~ / .m2 / eine Datei toolchain.xml mit folgendem Inhalt hinzugefügt:

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

Hier können Sie definieren, mit welchen verschiedenen JDKs Maven das Projekt erstellen kann, unabhängig davon, mit welchen JDK Maven ausgeführt wird. Ähnlich wie beim Definieren von JDK auf Projektebene in IDE.

Ondrej Burkert
quelle
2
Die beste Antwort! Vielen Dank. Dies erklärt eine klare Situation, in der wir Maven und das zu kompilierende Projekt mit zwei verschiedenen Java-Laufzeiten / Framework ausführen möchten.
Soundararajan
5

Eine einfache Lösung für das Problem -

JAVA_HOME = / usr / lib / jvm / java-6-sun / mvn Neuinstallation

Auf dem Mac würde es ungefähr so ​​aussehen -

JAVA_HOME = / Library / Java / JavaVirtualMachines / jdk1.7.0_21.jdk / Contents / Home / mvn Neuinstallation

PS: Ein Sonderfall, den ich gefunden habe, ist der oben angegebene Befehl, der bei 'Fisch'-Muscheln nicht funktioniert. Ich hatte auch Bash Shell zur Verfügung und es hat dort gut funktioniert. Verwenden Sie einfach den Befehl 'bash', um zur Bash-Shell zu wechseln.

Pankaj
quelle
5

Sie können das Kompilieren von Quellen mit verschiedenen JDKs mit konfigurieren maven-compiler-plugin.

Geben Sie einfach den Pfad zu javacin <executable>Tag an. ZB für Java11 sieht es so aus:

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

Um Auswirkungen auf Ihr Projekt und Ihre Umgebungsvariablen zu vermeiden, können Sie das Maven Compiler Plugin nur für den POM des Projekts konfigurieren und die Java-Version für Quelle und Ziel angeben

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

Sie können Maven so einstellen, dass jede Java-Version gemäß den folgenden Anweisungen verwendet wird.

Installieren Sie JENV in Ihrer Maschine Link

Überprüfen Sie die verfügbaren Java-Versionen, die auf Ihrem Computer installiert sind, indem Sie den folgenden Befehl in der Befehlszeile eingeben.

Jenv-Versionen

Sie können die globale Java-Version mit dem folgenden Befehl angeben.

jenv global oracle64-1.6.0.39

Sie können die lokale Java-Version für jedes Verzeichnis (Projekt) mit dem folgenden Befehl im Verzeichnis in der Befehlszeile angeben.

jenv local oracle64-1.7.0.11

füge die richtige Java-Version in deine pom.xml ein

Wenn Sie Maven in der Befehlszeile ausführen, installieren Sie das Jenv Maven-Plugin mit dem folgenden Befehl

jenv enable-plugin maven

Jetzt können Sie jede Java-Version auf Ihrem Computer problemlos für jedes Projekt konfigurieren.

Ranuka
quelle
1
wie diese Option. jenv ist wie virtualenv für Python
Jesse Zhuang
4

Auf Macs (vorausgesetzt, Sie haben die richtige Version installiert)

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

user2475448
quelle
4

Ohne Umgebungsvariablen zu ändern, können Sie die Java-Version basierend auf der Projektebene mithilfe des Maven Compiler Plugins verwalten.

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

Methode 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
quelle
2

Unter Windows füge ich dem Ordner Maven bin einfach mehrere Batchdateien für verschiedene JDK-Versionen hinzu:

mvn11.cmd

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

Anschließend können Sie mvn11Maven im angegebenen JDK ausführen.

Guo Ferrell
quelle
1

Ich hatte auf dem Mac keinen Erfolg, JAVA_HOMEwenn ich nur die Konsole einstellte, aber ich war mit diesem Ansatz erfolgreich

  • Erstellen Sie eine .mavenrc-Datei in Ihrem Home-Verzeichnis (so lautet der Pfad der Datei ~/.mavenrc
  • In diese Datei einfügen export JAVA_HOME=$(/usr/libexec/java_home -v 1.7)
Martin Vich
quelle
0

Sie können auch zwei Versionen von maven installieren und eine davon bearbeiten . Bearbeiten Sie hier:

mvn (Nicht-Windows) /mvn.bat/mvn.cmd (Windows)

Ersetzen Sie Ihre% java_home% -Erscheinungen durch den gewünschten Java-Pfad. Führen Sie dann einfach maven von diesem geänderten Pfad aus

Alberto Perez
quelle