Gradle พบ JAVA_HOME ผิดแม้ว่าจะตั้งค่าไว้ถูกต้องแล้ว


168

เมื่อพยายามรัน gradle ฉันได้รับข้อผิดพลาดต่อไปนี้:

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

อย่างไรก็ตามเมื่อฉันตรวจสอบตัวแปร JAVA_HOME ฉันจะได้รับ:

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

JAVA_HOME ของฉันถูกกำหนดใน. bashrc และฉันได้ตรวจสอบสองครั้งว่ามันถูกตั้งค่าเป็นแหล่งที่มา

การรันjava -versionยังยืนยันว่า JAVA_HOME ตั้งค่าไว้ถูกต้องและอยู่บน 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)

ฉันได้ตรวจสอบแล้วว่า/usr/bin/javasymlinks /etc/alternatives/javaซึ่ง symlinks อย่างถูกต้องไปแล้ว/usr/lib/jvm/java-7-oracle/jre/bin/java

นอกจากนี้ผมได้ตรวจสอบว่าไม่มีคำจำกัดความที่ซ้ำกันใน JAVA_HOME หรือ.bash_profile/etc/profile

ดังนั้นคำถามของฉันคือ Gradle ค้นหาได้/usr/lib/jvm/default-javaอย่างไรและที่สำคัญฉันจะชี้ไปยังไดเรกทอรีที่ถูกต้องได้อย่างไร

โปรแกรมอื่นที่ต้องการ JDK ทำงานได้ดีดังนั้นฉันคิดว่ามันเป็นปัญหา Gradle ฉันได้ลองทำการติดตั้ง Gradle ใหม่ซึ่งไม่ได้ทำให้แตกต่าง

ฉันใช้ 64 บิต Xubuntu (ฐาน Ubuntu 13.10)


โปรดระบุเอาต์พุตข้อผิดพลาดแบบเต็ม มันชัดเจนว่าข้อความมาจากไหน นอกจากนี้คุณมี/usr/lib/jvm/default-javaไดเรกทอรีหรือ symlink หรือไม่ แล้วคุณติดตั้ง Gradle ได้อย่างไร?
Peter Niederwieser

ฉันได้อัพเดต Q แล้ว แต่นั่นก็เป็นข้อผิดพลาดเต็มรูปแบบ ไม่มี/usr/lib/jvm/default-javaผบ. ติดตั้งด้วย apt (apt-get gradle install)
James Barnett

สคริปต์เริ่มต้น Gradle ไม่จำเป็นต้องJAVA_HOMEตั้งค่า หากJAVA_HOMEตั้งค่าไว้สคริปต์จะใช้$JAVA_HOME/bin/javaเพื่อเรียกใช้ Gradle มิฉะนั้นจะใช้java(เช่นjavaจะต้องมีในPATH) บางทีแพ็คเกจ apt (บุคคลที่สาม) อาจใช้สคริปต์เริ่มต้นที่แก้ไขแล้ว
Peter Niederwieser

แท้จริงแล้วดูเหมือนว่าสิ่งที่ผมได้รับ PPA ไบนารีจากได้เขียนยากและส่งออก JAVA_HOME usr/lib/jvm/defult-javaไป ขอบคุณสำหรับความช่วยเหลือ
James Barnett

คุณทำsource ~/.bashrcหรือรีบูตเครื่องหลังจากตั้งค่า JAVA_HOME หรือไม่
IgorGanapolsky

คำตอบ:


263

ปรากฎว่าไบนารี Gradle เฉพาะที่ฉันดาวน์โหลดจากที่เก็บ Ubuntu 13.10 นั้นพยายามส่งออก JAVA_HOME ขอบคุณลูคัสที่แนะนำสิ่งนี้

/usr/bin/gradle บรรทัด 70:

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

การแสดงความคิดเห็นบรรทัดนี้จะแก้ปัญหาและ Gradle ค้นหาเส้นทางที่ถูกต้องไปยังไบนารีของ Java

หากคุณเพิ่งดาวน์โหลดไบนารีจากเว็บไซต์ของพวกเขามันไม่มีปัญหานี้มันเป็นปัญหากับรุ่น repo ของ Ubuntu นอกจากนี้ยังมีปัญหาอื่น ๆ เกี่ยวกับรุ่น 13.10


แพคเกจการไล่ระดับสีดูเหมือนจะติดตั้ง jdk ไปยังตำแหน่งนี้อย่างน้อยใน Ubuntu 12.04 LTS ที่มีที่เก็บเริ่มต้นเท่านั้น ฉันทำสิ่งนี้บน Ubuntu VM ที่ไม่มี Java, snapshotted ก่อน, apt-get gradle (ซึ่งติดตั้งแพคเกจเกือบ 400), และติดตั้ง java เป็น / usr / lib / jvm ... reverted snapshot, ไม่ / usr / lib / JVM ฉันกำลังทดสอบทฤษฎีของสคริปต์ gradle ที่ส่งออก JAVA_HOME และมันก็ทำอย่างที่คุณพบ
Joshua McKinnon

2
Gradle ไม่ได้ทำเช่นนี้ มีคนอื่นจัดหา ppa ดังนั้นคุณต้องถามพวกเขา โดยทั่วไปแล้วฉันแนะนำให้ bootstrap Gradle ผ่าน Gradle Wrapper แทนที่จะติดตั้งผ่านตัวจัดการแพ็คเกจ
Peter Niederwieser

ฉันอัปเดตคำตอบเพื่อให้ชัดเจนยิ่งขึ้นว่าเวอร์ชั่น repo ของ Ubuntu เป็นปัญหาไม่ใช่ตัว Gradle
James Barnett

11
ขอขอบคุณฉันค้นหาวิธีแก้ปัญหานี้เป็นเวลากว่าหนึ่งชั่วโมง ขอบคุณสำหรับโพสต์นี้มันแก้ปัญหาของฉันใน Ubuntu 14.04
Kay Schneider

1
วิธีแก้ปัญหาของคุณเอง (และระเบิดพร้อมกัน)! เป็นที่น่าเสียดายที่คำถามนี้มีอายุหนึ่งปีและสคริปต์ Gradle ในที่เก็บยังไม่ได้รับการอัปเดตเพื่อแก้ไขปัญหานี้
sotrh

49

เพิ่มลิงก์สัญลักษณ์

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

@Nar คุณช่วยกรุณาระบุเส้นทางการติดตั้งของ JAVA
Shashi

ขอบคุณสำหรับคำตอบ แต่เส้นทางของ JAVA ไม่ได้เรื่องเพราะเส้นทางสคริปต์ gradle แทนที่เป็นกล่าวเจมส์stackoverflow.com/a/22309017/1679348
Nar

5
ทำงานได้ดีสำหรับฉัน ด้วยชื่อ ( default-java ) ฉันจะบอกว่านี่เป็นแนวทางที่สมเหตุสมผล
Phil

2
ในความคิดของฉันนี้เป็นทางออกที่ดีกว่าการเปลี่ยนไฟล์ Gradle (และใช่มันใช้งานได้ดีสำหรับฉัน)
zorglub76

ขอบคุณครับ! คุณประหยัดเวลาของฉัน!
AlexKh

21

วิธีแก้ไขคือทำให้ JAVA_HOME == dir เหนือ bin ซึ่ง javac มีชีวิตอยู่

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

ตกลงดังนั้นในที่สุดก็พบว่าถังขยะเหนือ javac ที่แท้จริงให้ทำเช่นนี้

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

ด้านบนสามารถทำให้เข้าใจง่ายและทำให้เป็นเรื่องทั่วไป

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

สำหรับฉันข้อผิดพลาดนี้เกิดจากเหตุผลที่Gradleติดตั้งเป็นsudoและฉันพยายามเป็นผู้ใช้เริ่มต้นเพื่อเรียกใช้ Gradle

ลอง:

sudo gradle -version

หรือ

sudo gradle -v

7

ลองติดตั้งรุ่นล่าสุดของgradle,

sudo add-apt-repository ppa:cwchien/gradle

sudo apt-get update

sudo apt-get install gradle

ถ้าเราติดตั้งจาก Ubuntu repo มันจะติดตั้งเวอร์ชั่นเก่า (สำหรับฉันมันคือ gradle 1.4) ในรุ่นเก่ามันชุดบ้าน Java จาก gradle export JAVA_HOME=/usr/lib/jvm/default-javaเป็น รุ่นล่าสุดไม่มีปัญหานี้


5

คุณเป็นexportของคุณJAVA_HOMEหรือไม่ หากไม่มีการส่งออกการตั้งค่าจะไม่ถูกเผยแพร่ไปยังคำสั่งที่เริ่มต้นภายในเชลล์นั้น นอกจากนี้ยังjava -versionไม่ได้ใช้JAVA_HOMEแต่จะใช้ครั้งแรกที่javaพบในเส้นทางของคุณ ตรวจสอบให้แน่ใจว่า.bashrcหน้าตาของคุณเป็นแบบนี้:

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

1
ใช่มันถูกกำหนดใน. bashrc เป็นexport JAVA_HOME=/usr/lib/jvm/java-7-oracle(ไวยากรณ์ที่แตกต่างกันเล็กน้อย แต่ฉันถือว่ามันเหมือนกัน)
James Barnett

3
@JamesBarnett gradleคำสั่งนั้นสามารถตั้งค่าตัวแปรนั้นได้หรือไม่? อาจเป็นบุคคลที่ติดตั้งgradleสร้างสคริปต์ตัวตัดที่ตั้งค่าตัวแปรสภาพแวดล้อมก่อนเริ่มโปรแกรมประยุกต์ เมื่อใช้ Tomcat ไม่ใช่เรื่องแปลกสำหรับcatalina.sh(ซึ่งเป็นสคริปต์เริ่มต้น) เพื่อเรียกใช้setenv.shเพื่อตั้งค่าตัวแปรสภาพแวดล้อมซึ่งอาจรวมถึงJAVA_HOME
Lucas

4

ฉันประสบปัญหานี้เมื่อฉันเรียกใช้คำสั่งต่อไปนี้บน Ubuntu:

ionic build android

เพื่อแก้ไขปัญหานี้ฉันได้ทำตามขั้นตอนต่อไปนี้:

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

เพิ่ม JAVA_HOME ใน / etc / environment:

vi /etc/environment

เพิ่ม:

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

หลังจากบันทึกอ่านแล้ว:

source /etc/environment

สุดท้ายคุณสามารถรันคำสั่ง build ได้


4

ฉันมีปัญหาเดียวกัน แต่ฉันไม่พบคำสั่งส่งออกในบรรทัด 70 ในไฟล์ gradle สำหรับเวอร์ชั่นล่าสุด 2.13 แต่ฉันเข้าใจผิดพลาดที่นั่นนั่นคือ

หากคุณไม่พบบรรทัด 70 ที่มีคำสั่งส่งออกในไฟล์ gradle ในโฟลเดอร์ gradle ของคุณ / bin / จากนั้นตรวจสอบ ~ / .bashrc ของคุณหากคุณพบ export JAVA_HOME==/usr/lib/jvm/java-7-openjdk-amd64/bin/javaให้ลบออก/bin/javaจากบรรทัดนี้เช่นJAVA_HOME==/usr/lib/jvm/java-7-openjdk-amd64และในเส้นทาง >>> แทน นี้ก็จะเป็นexport PATH=$PATH:$HOME/bin:JAVA_HOME/ จากนั้นเรียกexport PATH=$PATH:$HOME/bin:JAVA_HOME/bin/javasource ~/.bashrc

เหตุผลคือถ้าคุณตรวจสอบไฟล์ gradle ของคุณคุณจะพบในบรรทัด 70 (หากไม่มีคำสั่งส่งออก) หรือในบรรทัดที่ 75

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

นั่นหมายความว่า /bin/javaมีอยู่แล้วดังนั้นจึงต้องมีการระงับจากJAVA_HOMEเส้นทาง

ที่เกิดขึ้นในกรณีของฉัน


4

ใน Ubuntu ของฉันฉันปวดหัวเป็นเวลา 2 วันสำหรับปัญหานี้

ขั้นตอน 1. พิมพ์บนเทอร์มินัลwhereis java จากนั้นมันจะแสดงบางอย่างเช่นนี้

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

ขั้นตอนที่ 2 จดเส้นทาง: /usr/lib/jvm/java-8-openjdk-amd64/bin/java

ไม่รวม bin/java

JAVA_HOME = ของคุณ /usr/lib/jvm/java-8-openjdk-amd64


รหัสที่นี่คือการยกเว้น / bin / java
Borjante

2

สำหรับฉันชุดที่ชัดเจนในส่วนข้อโต้แย้งของการกำหนดค่าเครื่องมือภายนอกใน Eclipse เป็นปัญหา

ป้อนคำอธิบายรูปภาพที่นี่


2

คุณยังสามารถไปที่โฟลเดอร์ bin ภายในโฟลเดอร์การติดตั้ง gradle และแก้ไขพารามิเตอร์ JAVA_HOME ในไฟล์ gradle.bat ในกรณีของฉัน JAVA_HOME ของฉันถูกตั้งค่าเป็น c: \ Program files \ java \ bin JAVA_HOME ใน gradle.bat ถูกตั้งค่าเป็น% JAVA_HOME% \ bin \ java.exe

ฉันแก้ไข JAVA_HOME เป็น gradle.bat และใช้งานได้

ขอบคุณ!!!


มันคือตอนนี้ 2019 และนี่คือปัญหายังคง! ยกเว้นความแตกต่างเล็กน้อยและตัวแปรที่ผิดคือตอนนี้ "set JAVA_EXE =% JAVA_HOME% / bin / java.exe" - ลบส่วนของ bin ออกจากที่นี่เพื่อแก้ไข
Andy Lorenz

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

สร้างลิงก์สัญลักษณ์ไปยังไดเร็กทอรี default-java

คุณสามารถค้นหาไดเรกทอรี java ของคุณโดย

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.

คำตอบนี้จะได้รับการปรับปรุงหากคุณอธิบายว่าคำสั่งนี้ทำอะไรและทำไมจึงจำเป็น
Ian McLaird

2

ก่อนรันคำสั่งให้ลองป้อน:

export JAVA_HOME="path_to_java_home"

ที่ไหนpath_to_java_homeมีโฟลเดอร์ที่คุณbin/javaมี

หากติดตั้ง java อย่างถูกต้องคุณสามารถค้นหาตำแหน่งได้โดยใช้คำสั่ง:

readlink -f $(which java)

อย่าลืมลบออกbin/javaจากจุดสิ้นสุดของเส้นทางในขณะที่ใส่ลงไปJAVA_HOME


1

ฉันมีปัญหากับสิ่งนี้เช่นกัน มันบอกว่าไดเรกทอรีผิดเมื่อมันถูกต้อง ดังนั้นฉันเพิ่งสร้างตัวแปรท้องถิ่นด้วยชื่อของ JAVA_HOME ที่ละเว้น / bin / java สุดท้าย มันทำงานได้ดีสำหรับฉัน


1

หากตั้งค่าสภาพแวดล้อม GRADLE_HOME และ JAVA_HOME ของคุณอย่างถูกต้องให้ตรวจสอบไดเรกทอรี JDK ของคุณและตรวจสอบว่าคุณมีไฟล์java.exeภายใต้พา ธ ด้านล่าง

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

เป็นข้อผิดพลาดที่กล่าวถึงในไฟล์ 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.

ไม่สามารถระบุตำแหน่งการติดตั้งจาวาของคุณได้ ดังนั้นค้นหาและตั้งค่า

java.exe

ภายใต้%JAVA_HOME%/binถ้าทุกอย่างถูกต้อง

สิ่งนี้ใช้ได้สำหรับฉัน (บัญชีของฉันถูกปิดการใช้งานโดยลูกค้าและผู้ดูแลระบบของพวกเขาได้ลบ java.exe ออกจากไดเรกทอรีของฉัน)


0

ใน dockercontainer ของฉัน (มีปัญหาเล็กน้อยในการไม่พบจาวา) นั่นคือ "ซึ่ง" ไม่ได้ติดตั้ง การรวมโปรเจ็กต์โดยใช้ gradlew ใช้ซึ่งใน. /gradlew เพื่อค้นหาการติดตั้ง java ซึ่งแก้ไขปัญหาได้


0

[Windows] ดังที่ได้กล่าวไปแล้วดูเหมือนว่า. bat -file จะพยายามค้นหา java.exe จาก%JAVA_HOME%/bin/java.exeนั้นจึงหาไม่พบเนื่องจากbinทำซ้ำสองครั้งในเส้นทาง ลบส่วนเกินนั้น/binออกจาก gradle.bat

Gradle


0

การเพิ่มบรรทัดด้านล่างใน build.gradle แก้ไขปัญหาของฉัน

sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.