Gradle menemukan JAVA_HOME yang salah meskipun sudah diatur dengan benar


168

Saat mencoba menjalankan gradle, saya mendapatkan kesalahan berikut:

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

Namun, ketika saya memeriksa variabel JAVA_HOME saya mendapatkan:

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

JAVA_HOME saya didefinisikan dalam .bashrc dan saya telah memeriksa ulang bahwa itu ditetapkan sebagai sumber.

Menjalankan java -versionjuga mengonfirmasi bahwa JAVA_HOME diatur dengan benar dan berada di 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)

Saya juga telah memeriksa /usr/bin/javasymlink /etc/alternatives/javayang pada gilirannya symlinks dengan benar/usr/lib/jvm/java-7-oracle/jre/bin/java

Selain itu saya telah memeriksa bahwa tidak ada definisi JAVA_HOME duplikat di .bash_profileatau /etc/profile.

Jadi pertanyaan saya adalah bagaimana / mengapa menemukan Gradle /usr/lib/jvm/default-java, dan yang lebih penting bagaimana saya mengarahkannya ke direktori yang benar?

Program lain yang membutuhkan JDK berfungsi dengan baik, jadi saya pikir ini masalah Gradle. Saya juga mencoba menginstal ulang Gradle yang tidak ada bedanya.

Saya menjalankan 64bit Xubuntu (basis Ubuntu 13.10)


Harap berikan output kesalahan penuh. Seperti berdiri, tidak jelas dari mana pesan itu berasal. Juga, apakah Anda memiliki /usr/lib/jvm/default-javadirektori atau symlink? Dan bagaimana Anda menginstal Gradle?
Peter Niederwieser

Saya telah memperbarui Q, tapi itu cukup banyak adalah output kesalahan penuh. Tidak ada /usr/lib/jvm/default-javadir. Diinstal dengan apt (apt-get install gradle)
James Barnett

Skrip mulai Gradle tidak perlu JAVA_HOMEdisetel. Jika JAVA_HOMEdiatur, skrip digunakan $JAVA_HOME/bin/javauntuk menjalankan Gradle. Kalau tidak, ia menggunakan java(yaitu javaharus di PATH). Mungkin paket apt (pihak ketiga) menggunakan skrip awal yang dimodifikasi.
Peter Niederwieser

Ya sepertinya ppa apa pun yang saya dapatkan binernya dari yang sudah dikodekan dan diekspor ke JAVA_HOME usr/lib/jvm/defult-java. Terima kasih atas bantuannya
James Barnett

Apakah Anda melakukannya source ~/.bashrc, atau reboot mesin Anda setelah mengatur JAVA_HOME?
IgorGanapolsky

Jawaban:


263

Ternyata biner Gradle tertentu yang saya unduh dari repositori Ubuntu 13.10 sendiri mencoba untuk mengekspor JAVA_HOME. Terima kasih kepada Lucas untuk menyarankan ini.

/usr/bin/gradle baris 70:

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

Mengomentari baris ini menyelesaikan masalah, dan Gradle menemukan jalur yang benar ke biner Java.

Jika Anda hanya mengunduh biner dari situs web mereka, ia tidak memiliki masalah ini. Ini masalah dengan versi repo Ubuntu. Tampaknya juga ada beberapa masalah lain dengan versi 13.10.


Paket gradle tampaknya menginstal jdk ke lokasi ini, setidaknya di Ubuntu 12,04 LTS dengan hanya repositori default. Saya melakukan ini pada VM Ubuntu yang tidak memiliki Java, snapshotted terlebih dahulu, apt-get install gradle (yang menginstal hampir 400 paket), dan menginstal java ke / usr / lib / jvm ... snapshot yang dikembalikan, no / usr / lib / jvm. Saya sedang menguji teori skrip gradle yang mengekspor JAVA_HOME dan memang benar, seperti yang Anda temukan.
Joshua McKinnon

2
Gradle tidak melakukan ini. Ppa disediakan oleh orang lain, jadi Anda harus bertanya kepada mereka. Secara umum, saya akan merekomendasikan untuk bootstrap Gradle melalui Gradle Wrapper, daripada menginstalnya melalui manajer paket.
Peter Niederwieser

Saya memperbarui jawaban untuk membuatnya lebih jelas bahwa versi repo Ubuntu adalah masalahnya, bukan Gradle sendiri.
James Barnett

11
Terima kasih, saya mencari lebih dari satu jam untuk solusi untuk masalah ini. Terima kasih untuk posting ini, ini memecahkan masalah saya di ubuntu 14.04
Kay Schneider

1
Cara untuk memecahkan masalah Anda sendiri (dan milik saya secara bersamaan)! Sayang sekali pertanyaan ini berumur satu tahun dan skrip Gradle di repositori belum diperbarui untuk memperbaikinya.
sotrh

49

tambahkan tautan simbolis

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

@Nar, bisakah Anda memberikan jalur instalasi JAVA
Shashi

Terima kasih atas jawaban tetapi jalur JAVA tidak masalah karena skrip gradle menimpa jalur seperti yang dikatakan James stackoverflow.com/a/22309017/1679348
Nar

5
Bekerja dengan baik untuk saya. Diberi nama ( default-java ), saya akan mengatakan ini adalah pendekatan yang cukup masuk akal.
Phil

2
Menurut saya ini adalah solusi yang jauh lebih baik daripada mengubah file Gradle. (Dan ya, itu berfungsi baik untuk saya)
zorglub76

Terima kasih Pak! Anda menghemat waktu saya!
AlexKh

21

Solusinya adalah membuat JAVA_HOME == dir di atas bin tempat javac hidup

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 jadi akhirnya menemukan tempat sampah di atas javac yang sebenarnya jadi lakukan ini

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

di atas dapat disederhanakan dan digeneralisasikan ke

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

Bagi saya kesalahan ini adalah karena alasan Gradle diinstal sebagai sudo dan saya mencoba sebagai pengguna default untuk menjalankan Gradle.

Mencoba:

sudo gradle -version

atau

sudo gradle -v

7

Coba pasang versi terbaru gradle,

sudo add-apt-repository ppa:cwchien/gradle

sudo apt-get update

sudo apt-get install gradle

Jika kita menginstal dari repo ubuntu, itu akan menginstal versi lama, (bagi saya itu gradle 1.4). Dalam versi yang lebih lama, ini menetapkan java home dari gradle sebagai export JAVA_HOME=/usr/lib/jvm/default-java. Versi terbaru tidak memiliki masalah ini.


5

Apakah Anda exportAnda JAVA_HOME? Tanpa ekspor, pengaturan tidak akan disebarkan ke perintah yang dimulai di dalam shell itu. Juga, java -versiontidak menggunakan JAVA_HOME, melainkan menggunakan yang pertama javaditemukan di jalur Anda. Pastikan .bashrcpenampilan Anda seperti ini:

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

1
Ya, ini didefinisikan dalam .bashrc sebagai export JAVA_HOME=/usr/lib/jvm/java-7-oracle(sintaks yang sedikit berbeda tapi saya menganggap itu sama)
James Barnett

3
@ JamesBarnett, bisakah gradleperintah itu sendiri yang mengatur variabel itu? Mungkin orang yang menginstal gradlemembuat skrip pembungkus yang mengatur variabel lingkungan sebelum memulai aplikasi. Saat menggunakan kucing jantan, bukan hal yang aneh bagi catalina.sh(yang merupakan skrip startup) untuk memanggil a setenv.shuntuk mengatur variabel lingkungan yang mungkin termasukJAVA_HOME
Lucas

4

Saya menghadapi masalah ini ketika saya menjalankan perintah berikut di Ubuntu:

ionic build android

Untuk mengatasi masalah ini, saya melakukan langkah-langkah berikut:

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

Tambahkan JAVA_HOME ke / etc / environment:

vi /etc/environment

Menambahkan:

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

Setelah menyimpan, bacalah:

source /etc/environment

Akhirnya, Anda dapat menjalankan perintah build.


4

Saya memiliki masalah yang sama, tetapi saya tidak menemukan perintah ekspor pada baris 70 dalam file gradle untuk versi terbaru 2.13, tetapi saya mengerti kesalahan konyol di sana, yaitu mengikuti,

Jika Anda tidak menemukan baris 70 dengan perintah ekspor dalam file gradle di folder gradle Anda / bin /, maka periksa ~ / .bashrc Anda, jika Anda menemukan export JAVA_HOME==/usr/lib/jvm/java-7-openjdk-amd64/bin/java, kemudian hapus /bin/javadari baris ini, seperti JAVA_HOME==/usr/lib/jvm/java-7-openjdk-amd64, dan itu di jalur >>> sebagai gantinya ini export PATH=$PATH:$HOME/bin:JAVA_HOME/, akan menjadi export PATH=$PATH:$HOME/bin:JAVA_HOME/bin/java. Kemudian jalankan source ~/.bashrc.

Alasannya adalah, jika Anda memeriksa file gradle Anda, Anda akan menemukan di baris 70 (jika tidak ada perintah ekspor) atau di baris 75,

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

Itu berarti /bin/javasudah ada di sana, jadi perlu dikurangi dari JAVA_HOMEjalur.

Itu terjadi dalam kasus saya.


4

Di Ubuntu saya, saya sakit kepala selama 2 hari karena masalah ini.

Langkah 1. Ketik terminal whereis java maka akan muncul tampilan seperti ini

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

Langkah 2. Perhatikan jalur: /usr/lib/jvm/java-8-openjdk-amd64/bin/java

mengecualikan bin/java

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


Kuncinya di sini adalah untuk mengecualikan / bin / java
Borjante

2

Bagi saya set eksplisit pada bagian argumen konfigurasi alat eksternal di Eclipse adalah masalahnya.

masukkan deskripsi gambar di sini


2

Anda juga dapat membuka folder bin di dalam folder instalasi gradle Anda dan memperbaiki parameter JAVA_HOME dalam file gradle.bat. Dalam kasus saya, JAVA_HOME saya disetel ke c: \ Program files \ java \ bin JAVA_HOME di gradle.bat disetel ke% JAVA_HOME% \ bin \ java.exe.

Saya memperbaiki JAVA_HOME di gradle.bat dan berhasil.

Terima kasih!!!


sekarang 2019 dan ini MASIH masalah! Kecuali yang sedikit berbeda dan variabel yang salah sekarang "set JAVA_EXE =% JAVA_HOME% / bin / java.exe" - hapus bagian bin dari sini untuk memperbaikinya.
Andy Lorenz

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

Buat tautan simbolis ke direktori default-java.

Anda dapat menemukan direktori java Anda dengan

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.

Jawaban ini akan ditingkatkan jika Anda menjelaskan apa yang dilakukan perintah ini dan mengapa diperlukan.
Ian McLaird

2

Sebelum menjalankan perintah, coba masukkan:

export JAVA_HOME="path_to_java_home"

Di path_to_java_homemana folder tempat Anda bin/javaberada.

Jika java diinstal dengan benar, Anda dapat menemukan lokasi itu, dengan menggunakan perintah:

readlink -f $(which java)

Jangan lupa untuk menghapus bin/javadari ujung jalan sambil meletakkannyaJAVA_HOME


1

Saya punya masalah dengan ini juga. Dikatakan direktori yang salah ketika itu benar. Jadi saya baru saja membuat variabel lokal dengan nama JAVA_HOME menghilangkan final / bin / java. Ini bekerja dengan baik untukku.


1

Jika lingkungan GRADLE_HOME dan JAVA_HOME Anda diatur dengan benar maka periksa direktori JDK Anda dan pastikan Anda memiliki file java.exe di bawah jalur di bawah ini.

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

Seperti kesalahan yang disebutkan dalam file 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.

Itu tidak dapat menemukan instalasi java Anda. Jadi temukan dan atur

java.exe

di bawah %JAVA_HOME%/binjika semuanya benar.

Ini berfungsi untuk saya (akun saya dinonaktifkan oleh klien dan adminnya telah menghapus java.exe dari direktori saya.)


0

Dalam dockercontainer saya (minimal masalah tidak menemukan java) adalah, bahwa "yang" tidak diinstal. Comipling proyek menggunakan gradlew yang digunakan yang dalam ./gradlew untuk menemukan Instalasi java yang memecahkan masalah.


0

[Windows] Seperti yang sudah dikatakan, sepertinya .bat -file mencoba mencari java.exe dari %JAVA_HOME%/bin/java.exesehingga tidak ditemukan karena bindiulang dua kali di jalur. Hapus ekstra itu /bindari gradle.bat.

Gradle


0

Menambahkan baris di bawah ini di build.gradle memecahkan masalah saya.

sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.