Gradle tìm thấy sai JAVA_HOME mặc dù nó được đặt chính xác


168

Khi cố gắng chạy gradle, tôi gặp lỗi sau:

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

Tuy nhiên, khi tôi kiểm tra biến JAVA_HOME tôi nhận được:

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

JAVA_HOME của tôi được định nghĩa bằng .bashrc và tôi đã kiểm tra kỹ xem nó có được đặt làm nguồn không.

Chạy java -versioncũng xác nhận rằng JAVA_HOME được đặt chính xác và nằm trên 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)

Tôi cũng đã kiểm tra các /usr/bin/javaliên kết tượng trưng /etc/alternatives/javamà lần lượt các liên kết chính xác đến/usr/lib/jvm/java-7-oracle/jre/bin/java

Ngoài ra, tôi đã kiểm tra rằng không có định nghĩa JAVA_HOME trùng lặp trong .bash_profilehoặc /etc/profile.

Vì vậy, câu hỏi của tôi là làm thế nào / tại sao Gradle tìm thấy /usr/lib/jvm/default-java, và quan trọng hơn là làm thế nào để tôi trỏ nó vào đúng thư mục?

Các chương trình khác yêu cầu JDK hoạt động tốt, vì vậy tôi nghĩ đó là vấn đề Gradle. Tôi cũng đã thử cài đặt lại Gradle mà không có sự khác biệt.

Tôi đang chạy 64 bit Xubfox (cơ sở Ubuntu 13.10)


Vui lòng cung cấp đầu ra lỗi đầy đủ. Khi nó đứng, không rõ thông điệp đến từ đâu. Ngoài ra, bạn có một /usr/lib/jvm/default-javathư mục hoặc symlink? Và bạn đã cài đặt Gradle như thế nào?
Peter Niederwieser

Tôi đã cập nhật Q, nhưng khá nhiều là đầu ra lỗi đầy đủ. Không có /usr/lib/jvm/default-javathư mục. Được cài đặt với apt (apt-get install gradle)
James Barnett

Kịch bản bắt đầu Gradle không cần JAVA_HOMEphải được đặt. Nếu JAVA_HOMEđược đặt, tập lệnh sử dụng $JAVA_HOME/bin/javađể chạy Gradle. Mặt khác, nó sử dụng java(tức là javaphải ở trên PATH). Có lẽ gói apt (bên thứ ba) sử dụng tập lệnh bắt đầu được sửa đổi.
Peter Niederwieser

Yea trông giống như bất cứ thứ gì tôi nhận được nhị phân từ mã hóa cứng và xuất JAVA_HOME sang usr/lib/jvm/defult-java. Cảm ơn sự giúp đỡ
James Barnett

Bạn đã làm source ~/.bashrchay khởi động lại máy sau khi cài đặt JAVA_HOME?
IgorGanapolsky

Câu trả lời:


263

Lần lượt ra rằng nhị phân Gradle Đặc biệt tôi tải về từ 13.10 kho Ubuntu bản thân cố gắng để xuất khẩu JAVA_HOME. Cảm ơn Lucas đã gợi ý điều này.

/usr/bin/gradle dòng 70:

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

Nhận xét dòng này giải quyết vấn đề và Gradle tìm thấy đường dẫn chính xác đến nhị phân Java.

Nếu bạn chỉ tải xuống tệp nhị phân từ trang web của họ thì không có vấn đề này, đó là vấn đề với phiên bản repo của Ubuntu. Dường như cũng có một số vấn đề khác với phiên bản 13.10.


Gói gradle xuất hiện để cài đặt jdk vào vị trí này, ít nhất là trên Ubuntu 12.04 LTS chỉ với các kho lưu trữ mặc định. Tôi đã làm điều này trên một máy ảo Ubuntu không có Java, đã chụp nó trước, lớp cài đặt apt-get (cài đặt gần 400 gói) và nó đã cài đặt java thành / usr / lib / jvm ... ảnh chụp lại, không / usr / lib / jvm. Tôi đã thử nghiệm lý thuyết về tập lệnh gradle xuất JAVA_HOME và thực sự nó đúng như bạn tìm thấy.
Joshua McKinnon

2
Gradle không làm điều này. Ppa được cung cấp bởi người khác, và vì vậy bạn phải hỏi họ. Nói chung, tôi khuyên bạn nên bootstrap Gradle thông qua Gradle Wrapper, thay vì cài đặt nó thông qua trình quản lý gói.
Peter Niederwieser

Tôi đã cập nhật câu trả lời để làm rõ hơn rằng phiên bản repo Ubuntu là vấn đề chứ không phải bản thân Gradle.
James Barnett

11
Cảm ơn bạn, tôi tìm kiếm hơn một giờ cho một giải pháp cho vấn đề này. Cảm ơn vì bài đăng này, nó đã giải quyết vấn đề của tôi trên Ubuntu 14.04
Kay Schneider

1
Cách để giải quyết vấn đề của riêng bạn (và của tôi đồng thời)! Thật đáng tiếc khi câu hỏi này đã được một năm tuổi và tập lệnh Gradle trong kho lưu trữ đã không được cập nhật để sửa lỗi này.
sotrh

49

thêm một liên kết tượng trưng

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

@Nar bạn có thể vui lòng cung cấp đường dẫn cài đặt của JAVA
Shashi

Cảm ơn bạn đã trả lời nhưng đường dẫn của JAVA không quan trọng vì tập lệnh gradle ghi đè đường dẫn như James stackoverflow.com/a/22309017/1679348
Nar

5
Làm việc tốt cho tôi Đặt tên ( default-java ), tôi muốn nói rằng đây là một cách tiếp cận khá hợp lý.
Phil

2
Theo tôi đây là giải pháp tốt hơn nhiều so với việc thay đổi tập tin Gradle. (Và vâng, nó hoạt động tốt với tôi)
zorglub76 04/07/2015

Cảm ơn ngài! Bạn đã tiết kiệm thời gian của tôi!
AlexKh

21

Giải pháp là tạo JAVA_HOME == dir phía trên bin nơi javac sống như trong

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 vì vậy cuối cùng đã tìm thấy bin trên javac thực tế, vì vậy hãy làm điều này

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

ở trên có thể được đơn giản hóa và khái quát hóa để

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

Đối với tôi lỗi này là do lý do Gradle được cài đặt là sudo và tôi đã cố gắng làm người dùng mặc định để chạy Gradle.

Thử:

sudo gradle -version

hoặc là

sudo gradle -v

7

Hãy thử cài đặt phiên bản mới nhất của gradle,

sudo add-apt-repository ppa:cwchien/gradle

sudo apt-get update

sudo apt-get install gradle

Nếu chúng ta cài đặt từ repo ubfox, nó sẽ cài đặt phiên bản cũ, (đối với tôi nó là lớp 1.4). Trong phiên bản cũ hơn, nó đặt java home từ gradle là export JAVA_HOME=/usr/lib/jvm/default-java. Phiên bản mới nhất không có vấn đề này.


5

Bạn đã làm exportcủa bạn JAVA_HOME? Nếu không xuất, cài đặt sẽ không được truyền đến các lệnh được bắt đầu bên trong lớp vỏ đó. Ngoài ra, java -versionkhông sử dụng JAVA_HOME, thay vào đó, nó sử dụng đầu tiên javađược tìm thấy trong đường dẫn của bạn. Hãy chắc chắn rằng bạn .bashrctrông giống như thế này:

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

1
Vâng, nó được định nghĩa trong .bashrc là export JAVA_HOME=/usr/lib/jvm/java-7-oracle(cú pháp hơi khác nhau nhưng tôi giả sử nó giống nhau)
James Barnett

3
@JamesBarnett, gradlechính lệnh có thể thiết lập biến đó không? Có lẽ người đã cài đặt gradleđã tạo một tập lệnh bao bọc đặt các biến môi trường trước khi khởi động ứng dụng. Khi sử dụng tomcat, không có gì lạ khi catalina.sh(đó là tập lệnh khởi động) gọi ra setenv.shđể thiết lập các biến môi trường có thể bao gồmJAVA_HOME
Lucas

4

Tôi gặp phải vấn đề này khi chạy lệnh sau trên Ubuntu:

ionic build android

Để giải quyết vấn đề này, tôi đã làm các bước sau:

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

Thêm JAVA_HOME vào / etc / môi trường:

vi /etc/environment

Thêm vào:

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

Sau khi lưu, hãy đọc nó:

source /etc/environment

Cuối cùng, bạn có thể chạy lệnh build.


4

Tôi gặp vấn đề tương tự, nhưng tôi không tìm thấy lệnh xuất trong dòng 70 trong tệp gradle cho phiên bản 2.13 mới nhất, nhưng tôi hiểu một lỗi ngớ ngẩn ở đó, đó là sau,

Nếu bạn không tìm thấy dòng 70 với lệnh xuất trong tệp gradle trong thư mục gradle / bin /, thì hãy kiểm tra ~ / .bashrc của bạn, nếu bạn tìm thấy export JAVA_HOME==/usr/lib/jvm/java-7-openjdk-amd64/bin/java, sau đó xóa /bin/javakhỏi dòng này, như JAVA_HOME==/usr/lib/jvm/java-7-openjdk-amd64, và nó trong đường dẫn >>> thay vào đó về điều này export PATH=$PATH:$HOME/bin:JAVA_HOME/, nó sẽ được export PATH=$PATH:$HOME/bin:JAVA_HOME/bin/java. Sau đó chạy source ~/.bashrc.

Lý do là, nếu bạn kiểm tra tệp lớp của mình, bạn sẽ tìm thấy trong dòng 70 (nếu không có lệnh xuất) hoặc trong dòng 75,

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

Điều đó có nghĩa /bin/javalà đã có sẵn, vì vậy nó cần phải được trừ khỏi JAVA_HOMEđường dẫn.

Điều đó đã xảy ra trong trường hợp của tôi.


4

Trong Ubuntu của tôi, tôi đau đầu trong 2 ngày về vấn đề này.

Bước 1. Nhập vào thiết bị đầu cuối whereis java sau đó nó sẽ hiển thị một cái gì đó như thế này

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

Bước 2. Lưu ý đường dẫn: /usr/lib/jvm/java-8-openjdk-amd64/bin/java

loại trừ bin/java

JAVA_HOME của bạn = /usr/lib/jvm/java-8-openjdk-amd64


Chìa khóa ở đây là loại trừ / bin / java
Borjante

2

Đối với tôi, một bộ rõ ràng trên phần đối số của cấu hình các công cụ bên ngoài trong Eclipse là vấn đề.

nhập mô tả hình ảnh ở đây


2

Bạn cũng có thể chuyển đến thư mục bin bên trong thư mục cài đặt lớp và sửa tham số JAVA_HOME trong tệp gradle.bat. Trong trường hợp của tôi, JAVA_HOME của tôi đã được đặt thành c: \ Tệp chương trình \ java \ bin JAVA_HOME trong gradle.bat được đặt thành% JAVA_HOME% \ bin \ java.exe.

Tôi đã sửa JAVA_HOME trong gradle.bat và nó đã hoạt động.

Cảm ơn bạn!!!


bây giờ là năm 2019 và đây vẫn là một vấn đề! Ngoại trừ một chút khác biệt và biến có lỗi hiện đang "đặt JAVA_EXE =% JAVA_HOME% / bin / java.exe" - xóa phần bin khỏi đây để sửa.
Andy Lorenz

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

Tạo một liên kết tượng trưng đến thư mục java mặc định.

Bạn có thể tìm thấy thư mục java của bạn bằng cách

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.

Câu trả lời này sẽ được cải thiện nếu bạn giải thích lệnh này làm gì và tại sao cần.
Ian McLaird

2

Trước khi chạy lệnh, hãy thử nhập:

export JAVA_HOME="path_to_java_home"

Ở đâu path_to_java_homelà thư mục mà bạn bin/javalà.

Nếu java được cài đặt đúng cách, bạn có thể tìm thấy vị trí của nó, bằng cách sử dụng lệnh:

readlink -f $(which java)

Đừng quên xóa bin/javatừ cuối con đường trong khi đưa nó vàoJAVA_HOME


1

Tôi đã có một vấn đề với điều này quá. Nó nói sai thư mục khi nó đúng. Vì vậy, tôi chỉ tạo một biến cục bộ với tên của JAVA_HOME bỏ qua phần cuối / bin / java. Nó làm việc tốt cho tôi.


1

Nếu môi trường GRADLE_HOME và JAVA_HOME của bạn được đặt đúng, hãy kiểm tra thư mục JDK của bạn và đảm bảo bạn có tệp java.exe bên dưới đường dẫn bên dưới.

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

Như lỗi được đề cập trong tập tin 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.

Nó không thể xác định vị trí cài đặt java của bạn. Vì vậy, tìm và thiết lập

java.exe

dưới %JAVA_HOME%/binnếu mọi thứ đều đúng

Điều này hoạt động với tôi (tài khoản của tôi đã bị vô hiệu hóa bởi khách hàng và quản trị viên của họ đã xóa java.exe khỏi thư mục của tôi.)


0

Trong dockercontainer của tôi (tối thiểu là vấn đề không tìm thấy java), đó là "cái" không được cài đặt. Kết hợp một dự án bằng gradlew đã sử dụng trong ./gradlew để tìm java Cài đặt đã giải quyết vấn đề.


0

[Windows] Như đã nói, có vẻ như .bat -file cố gắng tìm java.exe từ %JAVA_HOME%/bin/java.exeđó để nó không tìm thấy vì nó binđược lặp lại hai lần trong đường dẫn. Loại bỏ thêm /bintừ gradle.bat.

Học sinh lớp


0

Thêm dòng dưới đây trong build.gradle đã giải quyết vấn đề của tôi.

sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.