Gradle findet falsches JAVA_HOME, obwohl es richtig eingestellt ist


168

Beim Versuch, gradle auszuführen, wird folgende Fehlermeldung angezeigt:

# gradle

ERROR: JAVA_HOME is set to an invalid directory: /usr/lib/jvm/default-java

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation.

Wenn ich jedoch die Variable JAVA_HOME überprüfe, erhalte ich:

# echo $JAVA_HOME 
/usr/lib/jvm/java-7-oracle

Mein JAVA_HOME ist in .bashrc definiert und ich habe doppelt überprüft, ob es als Quelle festgelegt ist.

Durch Ausführen wird java -versionaußerdem bestätigt, dass JAVA_HOME korrekt eingestellt ist und sich im PATH befindet.

# java -version
java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)

Ich habe auch die /usr/bin/javaSymlinks überprüft, zu /etc/alternatives/javadenen wiederum die Symlinks korrekt sind/usr/lib/jvm/java-7-oracle/jre/bin/java

Außerdem habe ich überprüft, dass in .bash_profileoder keine doppelten JAVA_HOME-Definitionen vorhanden sind /etc/profile.

Meine Frage ist also, wie / warum Gradle findet /usr/lib/jvm/default-javaund was noch wichtiger ist, wie ich es auf das richtige Verzeichnis verweise.

Andere Programme, für die das JDK erforderlich ist, funktionieren einwandfrei. Ich denke, es ist ein Gradle-Problem. Ich habe auch versucht, Gradle neu zu installieren, was keinen Unterschied machte.

Ich verwende 64-Bit-Xubuntu (Ubuntu 13.10-Basis)


Bitte geben Sie die vollständige Fehlerausgabe an. Derzeit ist nicht klar, woher die Nachricht kommt. Haben Sie auch ein /usr/lib/jvm/default-javaVerzeichnis oder einen Symlink? Und wie haben Sie Gradle installiert?
Peter Niederwieser

Ich habe das Q aktualisiert, aber das ist so ziemlich die vollständige Fehlerausgabe. Es gibt kein /usr/lib/jvm/default-javadir. Installiert mit apt (apt-get install gradle)
James Barnett

Das Gradle-Startskript muss nicht JAVA_HOMEfestgelegt werden. Wenn JAVA_HOMEfestgelegt, wird das Skript verwendet $JAVA_HOME/bin/java, um Gradle auszuführen. Andernfalls wird es verwendet java(dh javamuss auf dem sein PATH). Möglicherweise verwendet das apt-Paket (von Drittanbietern) ein modifiziertes Startskript.
Peter Niederwieser

Ja, es sieht so aus, als hätte jeder ppa, von dem ich die Binärdatei erhalten habe, das JAVA_HOME fest codiert und exportiert usr/lib/jvm/defult-java. Vielen Dank für die Hilfe
James Barnett

Haben Sie source ~/.bashrcIhren Computer nach dem Festlegen von JAVA_HOME neu gestartet?
IgorGanapolsky

Antworten:


263

Es stellt sich heraus, dass die bestimmte Gradle-Binärdatei, die ich aus dem Ubuntu 13.10-Repository selbst heruntergeladen habe, versucht, JAVA_HOME zu exportieren. Vielen Dank an Lucas für diesen Vorschlag.

/usr/bin/gradle Zeile 70:

export JAVA_HOME=/usr/lib/jvm/default-java

Das Kommentieren dieser Zeile löst das Problem und Gradle findet den richtigen Pfad zur Java-Binärdatei.

Wenn Sie nur die Binärdatei von ihrer Website herunterladen , tritt dieses Problem nicht auf. Dies ist ein Problem mit der Ubuntu-Repo-Version. Es scheint auch einige andere Probleme mit der Version 13.10 zu geben.


Das Gradle-Paket scheint das JDK an diesem Speicherort zu installieren, zumindest unter Ubuntu 12.04 LTS mit nur den Standard-Repositorys. Ich habe dies auf einer Ubuntu-VM ohne Java gemacht, zuerst einen Snapshot erstellt, apt-get install gradle (der fast 400 Pakete installiert) und Java in / usr / lib / jvm installiert ... Snapshot zurückgesetzt, no / usr / lib / jvm. Ich habe die Theorie des Gradle-Skripts getestet, das JAVA_HOME exportiert, und tatsächlich, wie Sie festgestellt haben.
Joshua McKinnon

2
Gradle macht das nicht. Der ppa wird von jemand anderem bereitgestellt, daher müssten Sie ihn fragen. Im Allgemeinen würde ich empfehlen, Gradle über den Gradle Wrapper zu booten, anstatt ihn über einen Paketmanager zu installieren.
Peter Niederwieser

Ich habe die Antwort aktualisiert, um klarer zu machen, dass die Ubuntu-Repo-Version das Problem ist, nicht Gradle selbst.
James Barnett

11
Vielen Dank, ich suche über eine Stunde nach einer Lösung für dieses Problem. Vielen Dank für diesen Beitrag, es löst mein Problem auf Ubuntu 14.04
Kay Schneider

1
Weg, um Ihr eigenes Problem (und meins gleichzeitig) zu lösen! Es ist eine Schande, dass diese Frage ein Jahr alt ist und das Gradle-Skript im Repository nicht aktualisiert wurde, um dies zu beheben.
Sotrh

49

Fügen Sie einen symbolischen Link hinzu

sudo ln -s /usr/lib/jvm/java-7-oracle /usr/lib/jvm/default-java

@Nar können Sie bitte den Installationspfad von JAVA
Shashi

Vielen Dank für die Antwort, aber der Pfad von JAVA spielt keine Rolle, da das Gradle-Skript den Pfad überschreibt, wie gesagt. James stackoverflow.com/a/22309017/1679348
Nar

5
Hat für mich gut funktioniert. Angesichts des Namens ( Standard-Java ) würde ich sagen, dass dies ein ziemlich vernünftiger Ansatz ist.
Phil

2
Meiner Meinung nach ist dies eine viel bessere Lösung als das Ändern von Gradle-Dateien. (Und ja, es funktioniert bei mir ganz gut)
zorglub76

Danke mein Herr! Du hast meine Zeit gespart!
AlexKh

21

Die Lösung besteht darin, JAVA_HOME == dir über bin zu machen, wo javac wie in lebt

type javac

javac is /usr/bin/javac   # now check if its just a symlink

ls -la /usr/bin/javac 

/usr/bin/javac -> /etc/alternatives/javac   # its a symlink so check again

ls -la /etc/alternatives/javac  # now check if its just a symlink

/etc/alternatives/javac -> /usr/lib/jvm/java-8-openjdk-amd64/bin/javac

OK, also endlich den Mülleimer über dem eigentlichen Javac gefunden, also mach das

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH

oben kann vereinfacht und verallgemeinert werden

which javac >/dev/null 2>&1 || die "ERROR: no 'javac' command could be found in your PATH"
export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which javac)  )))

13

Für mich war dieser Fehler auf den Grund zurückzuführen, dass Gradle als sudo installiert war und ich als Standardbenutzer versuchte, Gradle auszuführen.

Versuchen:

sudo gradle -version

oder

sudo gradle -v

7

Versuchen Sie, die neueste Version von zu installieren gradle.

sudo add-apt-repository ppa:cwchien/gradle

sudo apt-get update

sudo apt-get install gradle

Wenn wir von Ubuntu Repo installieren, wird die alte Version installiert (für mich war es Gradle 1.4). In der älteren Version wird Java von gradle as nach Hause gesetzt export JAVA_HOME=/usr/lib/jvm/default-java. Die neueste Version hat dieses Problem nicht.


5

Hast du exportdein JAVA_HOME? Ohne Export wird die Einstellung nicht an die Befehle weitergegeben, die in dieser Shell gestartet wurden. Auch java -versionnicht verwendet JAVA_HOME, sondern es verwendet die erste javain Ihrem Pfad gefunden. Stellen Sie sicher, dass Ihr .bashrcAussehen ungefähr so ​​aussieht:

JAVA_HOME=/path/to/java/home
export JAVA_HOME

1
Ja, es ist in .bashrc definiert als export JAVA_HOME=/usr/lib/jvm/java-7-oracle(etwas andere Syntax, aber ich nehme an, es ist die gleiche)
James Barnett

3
@ JamesBarnett, könnte der gradleBefehl selbst diese Variable setzen? Möglicherweise hat die installierte Person gradleein Wrapper-Skript erstellt, mit dem Umgebungsvariablen festgelegt wurden, bevor die Anwendung gestartet wurde. Wenn tomcat, ist es nicht ungewöhnlich , dass der catalina.sh(die das Start - Skript ist) , um eine rufen setenv.shUmgebungsvariablen einzurichten , die umfassen kannJAVA_HOME
Lucas

4

Ich hatte dieses Problem, als ich den folgenden Befehl unter Ubuntu ausführte:

ionic build android

Um dieses Problem zu lösen, habe ich die folgenden Schritte ausgeführt:

ln -sf /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java /usr/lib/jvm/default-java

Fügen Sie JAVA_HOME zu / etc / environment hinzu:

vi /etc/environment

Hinzufügen:

JAVA_HOME="/usr/lib/jvm/default-java"

Lesen Sie es nach dem Speichern:

source /etc/environment

Schließlich können Sie den Befehl build ausführen.


4

Ich hatte das gleiche Problem, aber ich habe den Exportbefehl in Zeile 70 in der Gradle-Datei für die neueste Version 2.13 nicht gefunden, aber ich verstehe dort einen dummen Fehler, der folgt:

Wenn Sie Zeile 70 mit dem Exportbefehl nicht in der Gradle-Datei in Ihrem Gradle-Ordner / bin / finden, überprüfen Sie Ihre ~ / .bashrc, wenn Sie sie finden export JAVA_HOME==/usr/lib/jvm/java-7-openjdk-amd64/bin/java, und entfernen Sie sie stattdessen /bin/javaaus dieser Zeile JAVA_HOME==/usr/lib/jvm/java-7-openjdk-amd64, und im Pfad >>> davon export PATH=$PATH:$HOME/bin:JAVA_HOME/wird es sein export PATH=$PATH:$HOME/bin:JAVA_HOME/bin/java. Dann renne source ~/.bashrc.

Der Grund ist, wenn Sie Ihre Gradle-Datei überprüfen, finden Sie in Zeile 70 (wenn es keinen Exportbefehl gibt) oder in Zeile 75,

JAVACMD="$JAVA_HOME/bin/java"
    fi
    if [ ! -x "$JAVACMD" ] ; then
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME

Das heißt, es /bin/javaist bereits vorhanden, daher muss es vom JAVA_HOMEPfad abgezogen werden .

Das ist in meinem Fall passiert.


3

In meinem Ubuntu habe ich 2 Tage lang Kopfschmerzen zu diesem Thema.

Schritt 1. Geben Sie auf dem Terminal ein, whereis java dann wird so etwas angezeigt

java: /usr/bin/java /etc/java /usr/share/java /usr/lib/jvm/java-8-openjdk-amd64/bin/java /usr/share/man/man1/java.1.gz

Schritt 2. Notieren Sie sich den Pfad: /usr/lib/jvm/java-8-openjdk-amd64/bin/java

ausschließen die bin/java

Ihr JAVA_HOME = /usr/lib/jvm/java-8-openjdk-amd64


Der Schlüssel hier ist, / bin / java auszuschließen
Borjante

2

Für mich war ein expliziter Satz im Argumentabschnitt der Konfiguration externer Tools in Eclipse das Problem.

Geben Sie hier die Bildbeschreibung ein


2

Sie können auch in den Ordner bin in Ihrem Gradle-Installationsordner wechseln und den Parameter JAVA_HOME in der Datei gradle.bat korrigieren. In meinem Fall wurde mein JAVA_HOME auf c: \ Programme \ java \ bin gesetzt. Das JAVA_HOME in gradle.bat wurde auf% JAVA_HOME% \ bin \ java.exe gesetzt.

Ich habe das JAVA_HOME in gradle.bat korrigiert und es hat funktioniert.

Danke dir!!!


Es ist jetzt 2019 und das ist immer noch ein Problem! Außer es ist etwas anders und die fehlerhafte Variable ist jetzt "set JAVA_EXE =% JAVA_HOME% / bin / java.exe" - entfernen Sie den bin-Teil von hier, um ihn zu reparieren.
Andy Lorenz

2
sudo ln -s /usr/lib/jvm/java-7-oracle/jre /usr/lib/jvm/default-java

Erstellen Sie einen symbolischen Link zum Standard-Java-Verzeichnis.

Sie finden Ihr Java-Verzeichnis unter

readlink -f $(which java) 
# outputs: /usr/lib/jvm/java-7-oracle/jre/bin/java
# Remove the last `/bin/java` and use it in above symbolic link command.

Diese Antwort würde verbessert, wenn Sie erklären würden, was dieser Befehl tut und warum er benötigt wird.
Ian McLaird

2

Geben Sie vor dem Ausführen des Befehls Folgendes ein:

export JAVA_HOME="path_to_java_home"

Wo path_to_java_homeist der Ordner, in dem Ihrbin/java befinden

Wenn Java ordnungsgemäß installiert ist, können Sie den Speicherort mithilfe des folgenden Befehls ermitteln:

readlink -f $(which java)

Vergessen Sie nicht, bin/javadas Ende des Pfades zu entfernen, während Sie ihn einfügenJAVA_HOME


1

Ich hatte auch ein Problem damit. Es sagte falsches Verzeichnis, als es richtig war. Also habe ich gerade eine lokale Variable mit dem Namen JAVA_HOME erstellt, wobei das endgültige / bin / java weggelassen wurde. Es hat gut für mich funktioniert.


1

Wenn Ihre GRADLE_HOME- und JAVA_HOME-Umgebung richtig eingestellt ist, überprüfen Sie Ihr JDK-Verzeichnis und stellen Sie sicher, dass sich die Datei java.exe unter dem folgenden Pfad befindet.

C:\Program Files (x86)\Java\jdk1.8.0_181\bin

Als Fehler in der Datei gradle.bat erwähnt

:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe

if exist "%JAVA_EXE%" goto init

echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

Es ist nicht in der Lage, Ihre Java-Installation zu finden. Also finden und einstellen

java.exe

unter %JAVA_HOME%/binwenn alles stimmt.

Dies funktioniert für mich (mein Konto wurde vom Client deaktiviert und der Administrator hat java.exe aus meinem Verzeichnis entfernt.)


0

In meinem Dockercontainer (da das Problem, Java nicht zu finden, minimal war) war das "was" nicht installiert. Beim Komprimieren eines Projekts mit gradlew wurde in ./gradlew Java gefunden. Installieren, wodurch das Problem behoben wurde.


0

[Windows] Wie bereits gesagt, sieht es so aus, als ob .bat -file versucht, java.exe zu finden, %JAVA_HOME%/bin/java.exesodass es nicht gefunden wird, da bines zweimal im Pfad wiederholt wird. Entfernen Sie das Extra /binaus gradle.bat.

Gradle


0

Das Hinzufügen der folgenden Zeilen in build.gradle hat mein Problem gelöst.

sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
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.