Maven kann Java 1.8 nicht erkennen


73

Ich kann Maven anscheinend nicht dazu bringen, Java 1.8 zu verwenden. Wenn Sie 1.8 als Ziel verwenden, wird der folgende Fehler angezeigt:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile
(default-compile) on project csaro: Fatal error compiling: invalid target
release: 1.8 -> [Help 1]

Die Ursache des Fehlers liegt auf der Hand: Maven verwendet nicht die richtige Version von Java:

$ mvn -version
Apache Maven 3.2.2 (45f7c06d68e745d05611f7fd14efb6594181933e; 2014-06-17T07:51:42-06:00)
Maven home: /usr/local/Cellar/maven/3.2.2/libexec
Java version: 1.7.0_51, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "mac os x", version: "10.9.2", arch: "x86_64", family: "mac"

Die installierte Version von Java sollte jedoch 1.8 sein:

$ java -version
java version "1.8.0_20-ea"
Java(TM) SE Runtime Environment (build 1.8.0_20-ea-b22)
Java HotSpot(TM) 64-Bit Server VM (build 25.20-b21, mixed mode)

Und JAVA_HOME ist gesetzt:

$ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home

Ich habe auch den Befehl hier ausprobiert (der erstellt mavenrc). Ich habe mehrmals versucht, den Computer neu zu starten, und habe überprüft, ob die env var richtig eingestellt ist (sie ist in eingestellt .bash_profile).

Maven wurde mit Homebrew installiert.

Java 1.8 funktioniert in Eclipse (das m2e verwendet) einwandfrei. Ich kann Maven einfach nicht dazu bringen, an der Kommandozeile zu arbeiten.


3
jdk1.8.0_20 wurde noch nicht veröffentlicht, und ich sehe ea nicht im Verzeichnisnamen. Sind Sie sicher, dass ein Verzeichnis vorhanden ist?
Jigar Joshi


@JigarJoshi, es ist die Early-Access-Version von hier .
Kat

Hat es einen Java-Compiler ls -la /Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home/bin/javac?
Jigar Joshi

Antworten:


55

Für mich war das Problem, dass bei der Installation von jdk-8u25-macosx-x64.dmgder Installation der /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDKVerzeichnislink zum neuen 1.8 JDK nicht aktualisiert wurde . Dies war möglicherweise nicht das Problem der ursprünglichen Frage, aber es war die Lösung für mich, als ich auf dieselbe Fehlermeldung stieß.

Ich weiß nicht, warum das Installationsprogramm es nicht verknüpft. Um die Sache noch verwirrender zu machen, ist der Pfad unterschiedlich, je nachdem, ob Sie es von Oracle oder Apple installiert haben. Siehe Mac OS X 10.6.7 Java Path Current JDK verwirrend

Ich habe Folgendes getan, um meine Umgebung zu reparieren

cd /System/Library/Frameworks/JavaVM.framework/Versions
sudo rm CurrentJDK
sudo ln -s /Library/Java/JavaVirtualMachines/<installed_jdk_version>.jdk/Contents CurrentJDK

4
Das gleiche Problem und das Beheben des "CurrentJDK" haben es für mich behoben.
MikeB

Ich bin root aber bekomme immer nochrm: CurrentJDK: Operation not permitted
raoulsson

Musste rootless ausschalten:https://www.quora.com/How-do-I-turn-off-the-rootless-in-OS-X-El-Capitan-10-11
raoulsson

46

Es stellt sich heraus, dass ich eine vergessene ~/.mavenrcDatei hatte, die den Wert von festgelegt hatte JAVA_HOME.

Überprüfen Sie für zukünftige Leser die folgenden Positionen auf Orte, die möglicherweise überschrieben werden JAVA_HOME(in aufsteigender Rangfolge):

  • ~/.bash_profile
  • ~/.bash_login
  • ~/.bashrc
  • ~/.profile
  • /etc/mavenrc
  • ~/.mavenrc

1
Ich konnte den Ort, an dem er eingestellt JAVA_HOMEist, nicht finden (falsch) - ich habe die von Ihnen aufgelisteten und viele weitere ausprobiert (/ etc / environment, / etc / profile, /etc/profile.d/*, ...). Am Ende habe ich mich für unset JAVA_HOMEmein entschieden ~/.bashrc- das ist derzeit wahrscheinlich die einzige Möglichkeit, es automatisch mit Ubuntus zu machen update-alternatives(da die meisten Programme versuchen, das richtige JAVA_HOME selbst herauszufinden, wenn es nicht eingestellt ist und eines der ersten Sie versuchen zu sehen, wohin die ausführbare Java-Datei zeigt.
Jakub Kotowski

Wenn Sie es deaktivieren können, sollten Sie auch in der Lage sein, den vorhandenen Wert einfach zu überschreiben.
Kat

Wenn ich JAVA_HOME in ~ / .bashrc setze, wird es für die gesamte Sitzung festgelegt und ändert sich nicht, wenn ich Update-Alternativen ausführe und in derselben Sitzung bleibe. Ich möchte, dass die meisten Apps und insbesondere Maven in diesem Moment die JVM-Version auswählen, die durch Update-Alternativen festgelegt wurde. Leider hält Ubuntu dieses Problem nicht für wichtig genug: bugs.launchpad.net/ubuntu/+source/java-common/+bug/45348
Jakub Kotowski

27

Die Lösung, die für mich funktioniert hat:

In Eclipse hatte ich in meinem Maven-Build eine falsche Ausführungskonfiguration. Gehe zu

Konfigurationen ausführen -> JRE [Tab]

und setzen Sie die Laufzeit auf Java 8.


Perfekte Entdeckung ... hatte seit langer Zeit
Probleme

26

Auf meinem CentOS 6.5-System ist das gleiche Problem aufgetreten.

java -versiongab eine Java 8-Version zurück, gab jedoch javac -versioneine Java 7-Version zurück.

Ich musste die folgenden Befehle ausführen, damit alle Arten von Java-bezogenen Symlinks auf meine JDK 8-Installation verweisen:

sudo alternatives --config java
sudo alternatives --config javac
sudo alternatives --config jre_openjdk
sudo alternatives --config java_sdk_openjdk

2
in meinem Fall war es sudo update-alternatives --config javac Sind Sie sicher, dass "Alternativen" kein Tippfehler ist?
PbxMan

update-alternativesist relevant für Debian und Ubuntu, während alternativeses für CentOS / RedHat relevant ist.
PdC

14

Ihr JAVA_HOMEwird von woanders überschrieben. Versuchen Sie, mvndirekt vor dem Java-Aufruf zu wiederholen .


1
Irgendwie habe ich diese Antwort erst zu spät bemerkt, aber sie hätte die Tatsache offenbart, dass ~/.mavenrcJAVA_HOME außer Kraft gesetzt wurde, also +1.
Kat

Ich denke speziell Einstellungen JAVA_HOME (z. B. in .bash_login mit Export JAVA_HOME = /usr/libexex/java_home -v 1.8) ist die beste Option
Scravy

Ich bin mit @scravy -export JAVA_HOME=$(/usr/libexec/java_home -v1.8)
Joensson

4

Beachten Sie, dass Sie mit Java 11 auch den Fehler "Ungültige Zielversion" erhalten können

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-
plugin:3.8.0:compile (default-compile) on project projects-migration: 
Fatal error compiling: error: invalid target release: 1.11 -> [Help 1]

wenn Sie 1.11statt nur 11im POM einstellen .

Falsch:

<java.version>1.11</java.version>

Richtig:

<java.version>11</java.version>

2

Ich hatte das gleiche Problem, brauchte 2 Schritte, um es richtig zu machen:

  1. Stellen Sie sicher JAVA_HOME, dass der Wert korrekt auf JDK zeigt.
  2. JDK und JRE in Eclipse sollten auf dieselbe Version verweisen.

Für mich war 1 Schritt richtig, der 2. Schritt hatte ein Problem. Zeigen Sie in Eclipse »Projekteigenschaften» Erstellungspfad »Installierte JRE» auf JDK.


0

Sie verwenden eine frühe Zugriffsversion von 1.8. Nachdem dies freigegeben wurde, sollten Sie die freigegebene Version installieren.

Überprüfen Sie Ihre Maven-Installation, um festzustellen, ob Ihnen eine Konfiguration zugeordnet ist, die ein bestimmtes JDK angibt. Gelegentlich gibt es Wrapper-Skripte, die JAVA_HOME vor dem Start des Maven zurücksetzen, oder die ausführbare Datei des Maven wird in einem Wrapper gestartet, der auf eine Konfigurationsdatei verweist, die Sie an eine bestimmte JVM binden könnte.


Was genau suche ich? Dort gibt es einen JRE-Ordner (sowie bin, db, lib und include). Soweit ich das beurteilen kann, scheint es dasselbe zu sein wie die anderen JREs. Ich habe dies von jdk8.java.net/download.html heruntergeladen . Und es funktioniert mit Eclipse (ich habe ein Lambda getestet).
Kat

1
Die neueste Version von Java 8 ist 1.8.0_05. Das jdk1.8.0_20-ea zeigt an, dass es sich um die 20. EARLY ACCESS-Version von Java 8 handelt, mit anderen Worten, um den 20. Blick auf 1.8.0, das jetzt in der fünften "Patch-Version" oder 1.8.0_05 enthalten ist. Wenn Sie einen Nicht-EA-Build erhalten, sollten Sie sich dafür entscheiden.
Edwin Buck

Ich habe gerade 1.8.0_05 ausprobiert (eigentlich habe ich das zuerst versucht) und Maven erkennt es immer noch nicht. Alles, was ich getan habe, war festgelegt JAVA_HOME(was andere Beiträge zu implizieren scheinen, ist alles, was benötigt wird). Abgesehen davon, ist 1.8.0_05 neuer als 1.8.0_20-ea?
Kat

1
Ja, 1.8.0_20-ea ist früher als 1.8.0_05. Vom ältesten zum neuesten ist es mehr geordnet 1.8.0_20-ea, 1.8.0, 1.8.0_05. Überprüfen Sie ein paar Dinge. which javaund dann einen ls -lder zurückgegebenen Werte (da er Sie unabhängig von der Umleitungsvariablen umleiten JAVA_HOMEund diese auch überprüfen PATHkann, da diese möglicherweise überschrieben javawird, bevor Sie zu den zu überprüfenden Elementen gelangen.
Edwin Buck

Vielen Dank. Ich sollte dann 1.8.0_05 verwenden. Ich war verwirrt darüber, welche Version die neueste Version war.
Kat

0

Wenn Sie Maven auf einem Server für kontinuierliche Integration verwenden, überprüfen Sie unbedingt die Einstellungen, da dies das von Maven verwendete JDK überschreiben kann. Für Jenkins musste ich das neue 1.8 JDK in den allgemeinen Einstellungen hinzufügen und mein Projekt für die Verwendung konfigurieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.