Gradle znajduje nieprawidłowy JAVA_HOME, mimo że jest poprawnie ustawiony

168

Podczas próby uruchomienia gradle pojawia się następujący błąd:

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

Jednak po sprawdzeniu zmiennej JAVA_HOME otrzymuję:

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

Mój JAVA_HOME jest zdefiniowany w .bashrc i dwukrotnie sprawdziłem, czy jest ustawiony jako źródło.

Uruchomienie java -versionpotwierdza również, że JAVA_HOME jest poprawnie ustawiona i znajduje się na PATH.

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

Sprawdziłem również, czy /usr/bin/javadowiązania symboliczne, do /etc/alternatives/javaktórych z kolei poprawnie prowadzą dowiązania symboliczne/usr/lib/jvm/java-7-oracle/jre/bin/java

Dodatkowo sprawdziłem, czy nie ma zduplikowanych definicji JAVA_HOME w .bash_profilelub /etc/profile.

Więc moje pytanie brzmi: jak / dlaczego Gradle znajduje /usr/lib/jvm/default-java, a co ważniejsze, jak wskazać właściwy katalog?

Inne programy, które wymagają JDK, działają dobrze, więc myślę, że jest to problem z Gradle. Próbowałem również ponownie zainstalować Gradle, co nie miało znaczenia.

Używam 64-bitowego Xubuntu (Ubuntu 13.10 base)

James Barnett
źródło
Proszę podać pełne dane wyjściowe błędu. W obecnej postaci nie jest jasne, skąd pochodzi wiadomość. Czy masz /usr/lib/jvm/default-javakatalog lub łącze symboliczne? Jak zainstalowałeś Gradle?
Peter Niederwieser
Zaktualizowałem Q, ale to w zasadzie pełne wyjście błędu. Nie ma /usr/lib/jvm/default-javareż. Zainstalowany z apt (apt-get install gradle)
James Barnett
Nie trzeba JAVA_HOMEustawiać skryptu startowego Gradle . Jeśli JAVA_HOMEjest ustawiona, skrypt używa $JAVA_HOME/bin/javado uruchomienia Gradle. W przeciwnym razie używa java(czyli javamusi być na PATH). Być może pakiet apt (innej firmy) używa zmodyfikowanego skryptu startowego.
Peter Niederwieser
Tak, wygląda na to, że ppa, z którego otrzymałem plik binarny, zostało na stałe zakodowane i wyeksportowane do JAVA_HOME usr/lib/jvm/defult-java. Dzięki za pomoc
James Barnett
Czy zrobiłeś to source ~/.bashrclub zrestartowałeś swój komputer po ustawieniu JAVA_HOME?
IgorGanapolsky

Odpowiedzi:

263

Okazuje się, że konkretny plik binarny Gradle, który pobrałem z repozytorium Ubuntu 13.10, sam próbuje wyeksportować JAVA_HOME. Dzięki Lucasowi za zasugerowanie tego.

/usr/bin/gradle wiersz 70:

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

Skomentowanie tego wiersza rozwiązuje problem, a Gradle znajduje poprawną ścieżkę do pliku binarnego Java.

Jeśli po prostu pobierzesz plik binarny z ich strony internetowej , nie ma tego problemu, jest to problem z wersją repozytorium Ubuntu. Wydaje się, że są też inne problemy z wersją 13.10.

James Barnett
źródło
Wydaje się, że pakiet gradle instaluje jdk w tej lokalizacji, przynajmniej w systemie Ubuntu 12.04 LTS z tylko domyślnymi repozytoriami. Zrobiłem to na maszynie wirtualnej Ubuntu, która nie miała Javy, najpierw wykonałem migawkę, apt-get install gradle (który instaluje prawie 400 pakietów) i zainstalowałem java w / usr / lib / jvm ... przywrócona migawka, nie / usr / lib / jvm. Testowałem teorię skryptu Gradle eksportującego JAVA_HOME i rzeczywiście tak jest, jak odkryłeś.
Joshua McKinnon
2
Gradle tego nie robi. PPA jest dostarczane przez kogoś innego, więc musisz go o to zapytać. Ogólnie zalecałbym załadowanie Gradle za pośrednictwem Gradle Wrapper, zamiast instalowania go przez menedżera pakietów.
Peter Niederwieser
Zaktualizowałem odpowiedź, aby wyjaśnić, że problem stanowi wersja repozytorium Ubuntu, a nie sam Gradle.
James Barnett,
11
Dziękuję, ponad godzinę szukam rozwiązania tego problemu. Dzięki za ten post, rozwiązuje mój problem na ubuntu 14.04
Kay Schneider
1
Sposób na rozwiązanie własnego problemu (i mojego jednocześnie)! Szkoda, że ​​to pytanie ma rok, a skrypt Gradle w repozytorium nie został zaktualizowany, aby to naprawić.
sotrh
49

dodaj dowiązanie symboliczne

sudo ln -s /usr/lib/jvm/java-7-oracle /usr/lib/jvm/default-java
Shashi
źródło
@Nar, czy mógłbyś podać ścieżkę instalacji JAVA
Shashi,
Dziękuję za odpowiedź, ale ścieżka do JAVA nie ma znaczenia, ponieważ skrypt gradle zastępuje ścieżkę, jak powiedział James stackoverflow.com/a/22309017/1679348
Nar
5
Działało dobrze dla mnie. Biorąc pod uwagę nazwę ( default-java ), powiedziałbym, że jest to dość rozsądne podejście.
Phil
2
Moim zdaniem jest to dużo lepsze rozwiązanie niż zmiana plików Gradle. (I tak, to działa dla mnie dobrze)
zorglub76
Dziękuję Panu! Zaoszczędziłeś mi czas!
AlexKh
21

Rozwiązaniem jest utworzenie JAVA_HOME == dir powyżej bin gdzie javac żyje jak w

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, więc w końcu znalazłem bin powyżej rzeczywistego javaca, więc zrób to

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

powyżej można uprościć i uogólnić na

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)  )))
Scott Stensland
źródło
13

U mnie ten błąd wynikał z powodu instalacji Gradle jako sudo i próbowałem jako domyślny użytkownik uruchomić Gradle.

Próbować:

sudo gradle -version

lub

sudo gradle -v
Jyoti Prakash
źródło
7

Spróbuj zainstalować najnowszą wersję gradle,

sudo add-apt-repository ppa:cwchien/gradle

sudo apt-get update

sudo apt-get install gradle

Jeśli zainstalujemy z repozytorium ubuntu, zainstaluje starą wersję (dla mnie był to gradle 1.4). W starszej wersji ustawia java home z gradle jako export JAVA_HOME=/usr/lib/jvm/default-java. Najnowsza wersja nie ma tego problemu.

Mohammed Safeer
źródło
5

Czy byłeś exportswoim JAVA_HOME? Bez eksportu ustawienie nie będzie propagowane do poleceń uruchamianych wewnątrz tej powłoki. Ponadto java -versionnie używa JAVA_HOME, a raczej używa pierwszego javaznalezionego na twojej ścieżce. Upewnij się, że .bashrcwyglądasz mniej więcej tak:

JAVA_HOME=/path/to/java/home
export JAVA_HOME
Lucas
źródło
1
Tak, jest zdefiniowany w .bashrc jako export JAVA_HOME=/usr/lib/jvm/java-7-oracle(nieco inna składnia, ale zakładam, że jest taka sama)
James Barnett
3
@JamesBarnett, czy gradlesamo polecenie może ustawić tę zmienną? Być może osoba, która zainstalowała, gradleutworzyła skrypt opakowujący, który ustawił zmienne środowiskowe przed uruchomieniem aplikacji. Podczas korzystania z tomcat często zdarza się, że catalina.sh(który jest skryptem startowym) wywołuje a, setenv.shaby skonfigurować zmienne środowiskowe, które mogą obejmowaćJAVA_HOME
Lucas
4

Napotkałem ten problem, gdy uruchomiłem następujące polecenie w systemie Ubuntu:

ionic build android

Aby rozwiązać ten problem, wykonałem następujące kroki:

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

Dodaj JAVA_HOME do / etc / environment:

vi /etc/environment

Dodaj:

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

Po zapisaniu przeczytaj:

source /etc/environment

Na koniec możesz uruchomić polecenie kompilacji.

Agilox
źródło
4

Miałem ten sam problem, ale nie znalazłem polecenia eksportu w linii 70 w pliku gradle dla najnowszej wersji 2.13, ale rozumiem głupią pomyłkę, czyli śledzenie

Jeśli nie znajdziesz linii 70 z poleceniem eksportu w pliku gradle w twoim folderze gradle / bin /, to sprawdź swój ~ / .bashrc, jeśli znajdziesz export JAVA_HOME==/usr/lib/jvm/java-7-openjdk-amd64/bin/java, a następnie usuń /bin/javaz tej linii, na przykład JAVA_HOME==/usr/lib/jvm/java-7-openjdk-amd64, i zamiast tego w ścieżce >>> z tego export PATH=$PATH:$HOME/bin:JAVA_HOME/będzie export PATH=$PATH:$HOME/bin:JAVA_HOME/bin/java. Następnie uruchomićsource ~/.bashrc .

Powodem jest to, że jeśli sprawdzisz plik gradle, znajdziesz w linii 70 (jeśli nie ma polecenia eksportu) lub w linii 75,

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

Oznacza to, /bin/javaże już tam jest, więc należy go odjąćJAVA_HOME ścieżki.

Tak było w moim przypadku.

nic specjalnego
źródło
4

W moim Ubuntu od 2 dni boli mnie ten problem.

Krok 1. Wpisz na terminalu, whereis java a wyświetli się coś takiego

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

Krok 2. Zwróć uwagę na ścieżkę: /usr/lib/jvm/java-8-openjdk-amd64/bin/java

wykluczyć bin/java

twój JAVA_HOME = /usr/lib/jvm/java-8-openjdk-amd64

MJ Montes
źródło
Kluczem tutaj jest wykluczenie / bin / java
Borjante
2

Dla mnie problemem był wyraźny zestaw w sekcji argumentów konfiguracji narzędzi zewnętrznych w Eclipse.

wprowadź opis obrazu tutaj

Aneesh Vijendran
źródło
2

Możesz także przejść do folderu bin w folderze instalacyjnym gradle i poprawić parametr JAVA_HOME w pliku gradle.bat. W moim przypadku mój katalog JAVA_HOME był ustawiony na c: \ Program files \ java \ bin JAVA_HOME w gradle.bat został ustawiony na% JAVA_HOME% \ bin \ java.exe.

Poprawiłem JAVA_HOME w gradle.bat i zadziałało.

Dziękuję Ci!!!

asp_NewBee
źródło
jest teraz 2019 i jest to NADAL problem! Z wyjątkiem tego, że jest nieco inny, a zmienną powodującą błąd jest teraz "ustaw JAVA_EXE =% JAVA_HOME% / bin / java.exe" - usuń stąd część bin, aby naprawić.
Andy Lorenz
2
sudo ln -s /usr/lib/jvm/java-7-oracle/jre /usr/lib/jvm/default-java

Utwórz dowiązanie symboliczne do katalogu default-java.

Możesz znaleźć katalog java przez

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.
Venkat Kotra
źródło
Ta odpowiedź byłaby lepsza, gdybyś wyjaśnił, co robi to polecenie i dlaczego jest potrzebne.
Ian McLaird
2

Przed uruchomieniem polecenia spróbuj wpisać:

export JAVA_HOME="path_to_java_home"

Gdzie path_to_java_homejest folder, w którym znajduje się plikbin/java znajdujesz.

Jeśli java jest poprawnie zainstalowana, możesz znaleźć jej lokalizację za pomocą polecenia:

readlink -f $(which java)

Nie zapomnij usunąć bin/javaz końca ścieżki podczas wkładania jejJAVA_HOME

Jasper Kinoti
źródło
1

Z tym też miałem problem. Mówił zły katalog, kiedy był poprawny. Więc właśnie utworzyłem zmienną lokalną o nazwie JAVA_HOME pomijając ostateczny / bin / java. U mnie to działało dobrze.

Łamacz skał
źródło
1

Jeśli środowisko GRADLE_HOME i JAVA_HOME jest ustawione poprawnie, sprawdź katalog JDK i upewnij się, że w ścieżce poniżej znajduje się plik java.exe .

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

Jak wspomniano o błędzie w pliku gradle.bat

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

Nie jest w stanie zlokalizować instalacji Java. Więc znajdź i ustaw

java.exe

pod, %JAVA_HOME%/binjeśli wszystko się zgadza.

To działa dla mnie (moje konto zostało wyłączone przez klienta, a ich administrator usunął java.exe z mojego katalogu).

Szorstki
źródło
0

W moim dockercontainerze (będąc minimalnym problemem braku znalezienia javy) było to, że „które” nie zostało zainstalowane. Łączenie projektu przy użyciu gradlew, w którym w ./gradlew znajduje się instalacja Java, która rozwiązała problem.

lem-fr
źródło
0

[Windows] Jak już powiedziano, wygląda na to, że .bat -file próbuje znaleźć plik java.exe, %JAVA_HOME%/bin/java.exewięc go nie znajduje, ponieważ binjest powtarzany dwukrotnie w ścieżce. Usuń ten dodatek /binz gradle.bat.

Gradle

O-9
źródło
0

Dodanie poniższych wierszy w build.gradle rozwiązało mój problem.

sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
Sameera De Silva
źródło