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/javaпосилання на /etc/alternatives/javaякі, у свою чергу, правильно посилаються/usr/lib/jvm/java-7-oracle/jre/bin/java

Крім того, я перевірив, що в .bash_profileабо немає дублікатів JAVA_HOME /etc/profile.

Отже, моє запитання полягає в тому, як / чому знаходить Gradle /usr/lib/jvm/default-java, і що ще важливіше, як я вказую його на правильний каталог?

Інші програми, які вимагають JDK, працюють добре, тому я вважаю, що це питання Gradle. Я також спробував перевстановити Gradle, що не мало значення.

Я працюю на 64-бітній Xubuntu (база Ubuntu 13.10)


Надайте повний вихід помилок. На даний момент не зрозуміло, звідки походить повідомлення. Також у вас є /usr/lib/jvm/default-javaкаталог чи символьна посилання? А як ви встановили Gradle?
Пітер Нідервайзер

Я оновив Q, але це майже все, що виходить з повної помилки. Немає /usr/lib/jvm/default-javaреж. Встановлено apt (apt-get install gradle)
Джеймс Барнетт

Сценарій запуску Gradle не потрібно JAVA_HOMEвстановлювати. Якщо JAVA_HOMEвстановлено, сценарій використовує $JAVA_HOME/bin/javaдля запуску Gradle. В іншому випадку він використовує java(тобто javaповинен бути увімкнено PATH). Можливо, пакет "третіх сторін" використовує модифікований сценарій запуску.
Пітер Нідервайзер

Так, схоже, що б я не отримав двійковий файл із жорсткого кодування та експортував JAVA_HOME в usr/lib/jvm/defult-java. Дякую за допомогу
Джеймс Барнетт

Ви зробили source ~/.bashrcчи перезавантажте машину після встановлення JAVA_HOME?
ІгорГанапольський

Відповіді:


263

Виявляється, конкретний двійковий файл Gradle, який я завантажив із сховища Ubuntu 13.10 , намагається експортувати JAVA_HOME. Дякую Лукасу за те, що він запропонував це.

/usr/bin/gradle рядок 70:

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

Коментування цього рядка вирішує проблему, і Gradle знаходить правильний шлях до бінарного файлу Java.

Якщо ви просто завантажите двійковий файл з свого веб-сайту, у нього не виникає цієї проблеми, це проблема з версією Ubuntu repo. Також, здається, є деякі інші проблеми з версією 13.10.


Пакет gradle, здається, встановить jdk до цього місця, принаймні, на Ubuntu 12.04 LTS з лише сховищами за замовчуванням. Я робив це на Vbuntu VM, у якого не було Java, спершу знімав її, apt-get install gradle (на якій встановлено майже 400 пакунків), і він встановлював java в / usr / lib / jvm ... знімається знімок, no / usr / lib / jvm. Я перевіряв теорію експорту скриптів gradle JAVA_HOME, і це дійсно так, як ви виявили.
Джошуа МакКіннон

2
Gradle цього не робить. Папку надає хтось інший, і тому вам доведеться запитати їх. Загалом, я б рекомендував завантажувати Gradle через Gradle Wrapper, а не встановлювати його через менеджер пакунків.
Пітер Нідервайзер

Я оновив відповідь, щоб було зрозуміліше, що версія репо Ubuntu - це проблема, а не сам Gradle.
Джеймс Барнетт

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
Нар.

5
Для мене працювали просто чудово. Враховуючи назву ( default-java ), я б сказав, що це досить розумний підхід.
Філ

2
На мою думку, це набагато краще рішення, ніж зміна файлів Gradle. (І так, це працює для мене просто чудово)
zorglub76

Дякую вам сер! Ти врятував мій час!
AlexKh

21

Рішення полягає в тому, щоб зробити JAVA_HOME == dir над біном, де живе 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 home від 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(трохи інший синтаксис, але я припускаю його те саме)
Джеймс Барнетт

3
@JamesBarnett, чи може сама gradleкоманда встановлювати цю змінну? Можливо, людина, яка встановила, gradleстворила сценарій обгортки, який встановлював змінні середовища перед запуском програми. Під час використання tomcat не рідкість catalina.sh((це сценарій запуску) закликає a, 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/java. Потім бігайтеsource ~/.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: \ програмні файли \ java \ bin. JAVA_HOME у gradle.bat було встановлено на% JAVA_HOME% \ bin \ java.exe.

Я виправив JAVA_HOME в gradle.bat і він спрацював.

Дякую!!!


його зараз 2019 рік, і це ВИНАГОДИ проблема! За винятком дещо іншого, і змінна при помилці тепер "встановити JAVA_EXE =% JAVA_HOME% / bin / java.exe" - видаліть частину біна звідси, щоб виправити.
Енді Лоренц

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

Створіть символічне посилання на каталог 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.

Ця відповідь буде покращена, якби ви пояснили, що робить ця команда та навіщо вона потрібна.
Ян МакЛайд

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. Тож знайдіть і встановіть

java.exe

під %JAVA_HOME%/bin якщо все правильно.

Це працює для мене (мій обліковий запис був відключений клієнтом, і його адміністратор видалив java.exe з мого каталогу.)


0

У моєму докерконтейнері (будучи мінімальною проблемою не знайти java) було те, що "яке" не було встановлено. Складання проекту за допомогою gradlew, який використовується в ./gradlew, щоб знайти java Установка, яка вирішила проблему.


0

[Windows] Як вже було сказано, це виглядає як .bat -file намагається знайти java.exe з, %JAVA_HOME%/bin/java.exeщоб він не знаходив його, оскільки binповторюється двічі по шляху. Видаліть, що зайве /binз gradle.bat.

Градле


0

Додавання нижче рядків у build.gradle вирішило мою проблему.

sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.