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). Возможно (сторонний) пакет apt использует модифицированный стартовый скрипт.
Питер Нидервизер

Да, похоже, что любой ppa, из которого я получил двоичный файл, жестко запрограммировал и экспортировал 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 только с репозиториями по умолчанию. Я сделал это на виртуальной машине Ubuntu, у которой не было Java, сначала сделал снимок, apt-get install gradle (который устанавливает почти 400 пакетов), и он установил java в / usr / lib / jvm ... обратный снимок, нет / usr / Библиотека / JVM. Я тестировал теорию экспорта сценариев Gradle JAVA_HOME, и это действительно так, как вы обнаружили.
Джошуа Маккиннон,

2
Gradle не делает этого. PPA предоставлен кем-то еще, и поэтому вам придется спросить их. В общем, я бы рекомендовал загружать Gradle через Gradle Wrapper, а не устанавливать его через менеджер пакетов.
Питер Нидервизер

Я обновил ответ, чтобы было яснее, что проблема в репо-версии Ubuntu, а не в самой Gradle.
Джеймс Барнетт

11
Спасибо, я ищу более часа для решения этой проблемы. Спасибо за этот пост, он решает мою проблему на Ubuntu 14.04
Кей Шнайдер

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 ), я бы сказал, что это довольно разумный подход.
Фил

2
На мой взгляд, это гораздо лучшее решение, чем изменение файлов Gradle. (И да, у меня это работает просто отлично)
zorglub76

Спасибо, сэр! Вы сэкономили мое время!
АлексХ

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, он установит старую версию (для меня это был Gradle 1.4). В более старой версии он устанавливает java home из gradle as 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(что является сценарием запуска) вызывать 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

Наконец, вы можете запустить команду сборки.


4

У меня была та же проблема, но я не нашел команду экспорта в строке 70 в файле Gradle для последней версии 2.13, но я понимаю глупую ошибку, которая заключается в следующем,

Если вы не нашли строку 70 с командой export в файле 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


Ключевым
моментом

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" - удалите часть корзины отсюда, чтобы исправить.
Энди Лоренц

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.

Этот ответ был бы лучше, если бы вы объяснили, что делает эта команда и зачем она нужна.
Ян Маклаирд

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

В моем dockercontainer (будучи минимальным проблема с поиском java) было то, что «которое» не было установлено. Компиляция проекта с использованием 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.