Geben Sie JDK für Maven an

141

Ich versuche ein Hudson-Plugin zu erstellen, das ich geändert habe, und es erfordert jdk1.6. Das ist in Ordnung, aber ich sehe nicht, wie ich Maven sagen kann, wo der andere JDK ist. Ich habe im Internet nur wenige Erwähnungen gefunden, aber sie scheinen nicht auf mich zuzutreffen. Einige schlagen vor, eine Konfiguration hinzuzufügen, .m2/settings.xmlaber ich habe keine settings.xml. Außerdem möchte ich 1.6 nicht für alle Maven-Builds verwenden.

Ein Knick ist, dass ich mvnin Cygwin benutze, wenn das überhaupt wichtig ist. Es scheint, dass ich in der Lage sein sollte, die Spezifikation in der Projekt-POM-Datei zu erstellen, aber der vorhandene POM ist ziemlich kahl.

Unterm Strich gibt es also eine Möglichkeit, ein JDK für einen einzelnen Aufruf von Maven anzugeben?

DanInDC
quelle

Antworten:

142

Unterm Strich gibt es also eine Möglichkeit, ein JDK für einen einzelnen Aufruf von Maven anzugeben?

Ändern Sie vorübergehend den Wert Ihrer JAVA_HOMEUmgebungsvariablen.

Pascal Thivent
quelle
10
Beispiel in Windows:set JAVA_HOME="C:\Java\jdk7"
Acdcjunior
6
in lubuntu: JAVA_HOME = "/ home / desa / programas / jdks / jdk1.6.0_45 /" mvn -v
Enrique San Martín
8
Und für den Fall, dass jemand anderes vergisst und sich ewig fragt, warum er es nicht ändern kann: JAVA_HOMEKann in dieser Datei für Maven (zumindest auf dem Mac) eingestellt werden: /private/etc/mavenrc - Und das kann so etwas wie (beachten Sie die Backticks, nicht einfache Anführungszeichen!):export JAVA_HOME=`/usr/libexec/java_home -v 1.7.0_75`
RedYeti
3
Unix: export JAVA_HOME='D:/dev/java/jdk8/jre'(arbeitet für mich)
Christophe Roussy
2
Wenn ich JAVA_HOME ändere und es dann tue java -version, wird immer noch die vorherige Version gedruckt.
Ocramot
82

Scheint, dass Maven jetzt hier eine Lösung bietet: Kompilieren von Quellen mit einem anderen JDK

JAVA_HOMEAngenommen , Ihre Punkte beziehen sich auf JDK7 (das Maven-Prozesse ausführt).

Ihr pom.xmlkönnte sein:

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

Wenn Ihre Entwickler nur die folgenden Zeilen hinzufügen (und anpassen) settings.xml, ist Ihr POM plattformunabhängig:

<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
quelle
18
Abgestimmt! Ich habe festgestellt, dass ich -Dmaven.compiler.fork=trueund -Dmaven.compiler.executable=/path/to/target/javacin der Kommandozeile verwenden kann.
Jin Kwon
Selbst wenn Sie diese Java-Optionen verwenden, müssen Sie dies dem Compiler-Plugin <executable> $ {maven.compiler.executable} </ ausführbar> hinzufügen
Paul Gregoire
2
@JinKwon Das Übergeben von Optionen mit -D funktioniert einwandfrei, auch ohne es im Abschnitt zum Compiler-Plugin zu definieren. Dies ist gut für den gelegentlichen Gebrauch oder für Skripte. Sie sollten es in eine separate Antwort einfügen, damit wir darüber abstimmen können!
Gaëtan Lehmann
Diese Lösung schlug fehl, als ich versuchte, Tests in Java 8 auszuführen. Ich erhielt * Nicht unterstützte major.minor Version 52.0 *
edwin
39

compile: compile verfügt über eine Benutzereigenschaft , mit der Sie einen Pfad zum angeben können javac.

Beachten Sie, dass diese Benutzer - Eigenschaft funktioniert nur , wenn forkist , truedas ist falsestandardmäßig aktiviert .

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

Möglicherweise müssen Sie den Wert in doppelte Anführungszeichen setzen, wenn er Leerzeichen enthält.

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

Siehe auch Vorrang für benutzerdefinierte Maven-Eigenschaften .

Jin Kwon
quelle
Ich musste auch meine JAVA_HOMEVariable überschreiben . Zum Beispiel (in 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

Wie du gesagt hast "Plus, ich möchte 1.6 nicht für alle Maven-Builds verwenden." .... Also besser, ich werde sagen, ändere deine POM-Datei und gib an, welche JDK-Version verwendet werden soll.

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

Dadurch wird sichergestellt, dass Ihr spezielles Projekt diese Version von jdk verwendet.

DevCoder
quelle
6
Dies ist nur der Ausgangspunkt, aber nicht die Lösung. Dies ist die Voraussetzung dafür, dass das Maven-Compiler-Plugin für 1.7 kompiliert wird. Und dann ist der Trick, Maven wirklich in der Lage zu machen, für 1.7 zu kompilieren, was nicht so trivial ist, wenn Ihre aktuelle Java-Version anders ist ...
Sergey Ushakov
Das ist eine andere Frage stackoverflow.com/questions/16723533/…
Paul Verest
14

Ich sage, Sie richten die JAVA_HOMEUmgebungsvariable so ein, wie Pascal sagt: Wenn Sie in Cygwin bash verwenden, wie Ihre Shell sein sollte:

export JAVA_HOME=/cygdrive/c/pathtothejdk

Es schadet nie, auch prepend den Java - binVerzeichnispfad zur PATHUmgebungsvariable mit:

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

Fügen Sie außerdem hinzu maven-enforce-plugin, um sicherzustellen, dass das richtige JDK verwendet wird. Dies ist eine gute Übung für Ihren 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>

Weitere Informationen finden Sie unter Maven Enforcer-Plugin - Verwendung .

feniix
quelle
1
Dies war perfekt, um die genaue Version des JDK anzugeben . Zum Beispiel habe ich ein Projekt, das bei Verwendung des anfänglichen JDK 1.8 fehlschlägt, aber bei Verwendung von JDK 1.8.0_77 funktioniert es einwandfrei. Ich hatte beide JDKs installiert und mit dieser Lösung sagte mir Maven, dass ich die falsche Version von 1.8 verwende, bis ich meinen JAVA_HOME-Pfad so geändert habe, dass er auf den spezifischen Ordner 1.8.0_77 abzielt. Die anderen Antworten erlaubten es Ihnen nicht, die Version so detailliert zu gestalten.
Bojingo
13

Ich weiß, dass es ein alter Thread ist. Aber ich hatte einige Probleme mit etwas Ähnlichem in Maven für Java 8 Compiler-Quelle. Ich habe dies mit einer schnellen Lösung herausgefunden, die in diesem Artikel erwähnt wird. Ich dachte, ich kann es hier einfügen und vielleicht anderen helfen:

<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
quelle
1
Nach dem Hinzufügen dieser Zeilen ist möglicherweise ein Maven-Update erforderlich (Eclipse: Klicken Sie mit der rechten Maustaste auf das Projekt, Maven, Update-Projekt)
Romano
Das Festlegen der Eigenschaften von maven.compiler verhindert nicht, dass der Code in Java 11 hinzugefügte Methoden verwendet. Zum Beispiel String.repeat (). Dies beim Bauen mit JDK 11. Also baut der Maven, aber ich wünschte, es würde scheitern
Enrico Giurin
6

Maven verwendet die Variable $ JAVACMD als letzten Java-Befehl. Legen Sie fest, wo sich die ausführbare Java-Datei befindet, um Maven auf ein anderes JDK umzuschalten.

Lin Gao
quelle
Danke Kumpel, nachdem wir 10 Stunden verbracht haben, haben wir mit Hilfe Ihrer Antwort behoben.
Mukul_3062
3

Mit Hudson können Sie auch mehrere Java-Laufzeiten definieren und Maven mit einer davon aufrufen. Schauen Sie sich die Konfigurationsseite genauer an.

Thorbjørn Ravn Andersen
quelle
Das OP erstellt ein Hudson-Plugin in der Befehlszeile, nicht unter Hudson (zumindest ist dies mein Verständnis).
Pascal Thivent
3

Wenn Sie Java brewin installiert haben, Macfinden Sie Ihr Java-Home-Verzeichnis wahrscheinlich hier:

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

Der nächste Schritt wäre nun zu finden, auf welches Java HomeVerzeichnis maven zeigt. Um es zu finden, geben Sie den folgenden Befehl ein:
mvn -version

Geben Sie hier die Bildbeschreibung ein

Die Felder, die uns hier interessieren, sind: Java versionund runtime.

Maven zeigt derzeit auf Java 13. Außerdem können Sie den Java-Home-Pfad unter der Schlüssellaufzeit sehen:
/usr/local/Cellar/openjdk/13.0.2+8_2/libexec/openjdk.jdk/Contents/Home

Um die Java-Version des Maven zu ändern, müssen Sie den Java 8Home-Pfad zur JAVA_HOMEenv-Variablen hinzufügen .

Dazu müssen wir den Befehl ausführen:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home im Terminal.

Wenn wir nun die Maven-Version überprüfen, können wir sehen, dass sie jetzt auf Java 8 zeigt.

Geben Sie hier die Bildbeschreibung ein

Das Problem dabei ist, wenn Sie die Maven-Version im neuen Terminal erneut überprüfen, werden Sie feststellen, dass sie auf Java 13 verweist. Um dies zu vermeiden, würde ich vorschlagen, die JAVA_HOMEVariable in die ~/.profileDatei aufzunehmen.

Auf diese Weise nimmt Ihr Terminal beim Laden standardmäßig den Wert an, den Sie in JAVA_HOME definiert haben. Dies ist die Zeile, die Sie in die ~/.profileDatei einfügen müssen:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

Sie können ein neues Terminal öffnen und die Maven-Version ( mvn -version) überprüfen. Sie werden feststellen, dass diesmal auf Java 8 verwiesen wird.

Rito
quelle
0

Ich hatte ein Problem mit Maven in Eclipse unter Windows 7.

Obwohl ich beobachtet habe, dass mvn build von der Kommandozeile aus einwandfrei lief.

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

Eclipse erwog als Standard-JVM eine JRE-Installation anstelle von JDK, sodass die Kompilierung fehlschlug.

Ich habe der folgenden Zeile zu eclipse.ini hinzugefügt:

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

Auch wenn ich von Eclipse ausgehe, habe ich im Abschnitt "Ziele" folgende Liste verwendet:

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

Kompilierungsfehler wurde behoben.

Aprodan
quelle
0

Für 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
quelle
0

Eine weitere Alternative zum Verwalten mehrerer JDK-Versionen ist jEnv

Nach der Installation können Sie die Java-Version einfach "lokal" ändern, dh für ein bestimmtes Projektverzeichnis, indem Sie:

jenv local 1.6

Dadurch wird mvn diese Version auch lokal verwenden, wenn Sie das mvn-Plugin aktivieren:

jenv enable-plugin maven
Ahmad Abdelghany
quelle
0

Sie können das JDK für Maven auch in einer Datei in Ihrem Home-Verzeichnis festlegen ~/.mavenrc:

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

Diese Umgebungsvariable wird vom MVN-Skript überprüft und verwendet, wenn vorhanden:

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

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

Spindizzy
quelle