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.

Kat
quelle
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
Überprüfen Sie die Antwort stackoverflow.com/questions/18144660/what-is-path-of-jdk-on-mac .
Federico Piazza
@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
Haben Sie diesen stackoverflow.com/questions/2503658/… gesehen ?
Diogo Moreira

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
Kirby
quelle
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
Kat
quelle
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.

Bevor
quelle
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
Abdull
quelle
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 .

Jigar Joshi
quelle
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>
Andrew Spencer
quelle
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.

Sandeep Pandey
quelle
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.

Edwin Buck
quelle
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.

Henno Vermeulen
quelle