Gradle не может найти Java при запуске "./gradlew shadowJar" - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь создать файл jar, который включает MySQL driver для JDBC.Пока у меня есть очень простой build.gradle файл, который использует плагин shadowJar для создания этого jar файла.

Проблема в том, что при запуске чего-либо, связанного с Gradle, я получаю эту ошибку:

ERROR: JAVA_HOME is set to an invalid directory: /usr/lib/jvm/jdk-11.0.1/bin/java

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation.

При попытке найти Java с $ which java я получаю

/usr/bin/java

, а с $ ls -la /usr/bin | grep -i javaj я получаю

lrwxrwxrwx  1 root     root          22 Sep 21 11:32 java -> /etc/alternatives/java
lrwxrwxrwx  1 root     root          29 Nov  5 21:12 java2groovy -> /etc/alternatives/java2groovy
lrwxrwxrwx  1 root     root          23 Nov  5 20:33 javac -> /etc/alternatives/javac
lrwxrwxrwx  1 root     root          25 Nov  5 20:33 javadoc -> /etc/alternatives/javadoc
lrwxrwxrwx  1 root     root          23 Nov  5 20:33 javah -> /etc/alternatives/javah
lrwxrwxrwx  1 root     root          23 Nov  5 20:33 javap -> /etc/alternatives/javap

Пока что ничего из этой информациибыло полезно для меня, но я оставляю это здесь на всякий случай.

Кроме того, когда я использую $ readlink -f $(which java), я получаю:

/usr/lib/jvm/jdk-11.0.1/bin/java

Что мне кажется, что этосоответствующий путь, который пытается найти Gradle.

Наконец, в моем .bashrc я поместил это в файл, чтобы установить JAVA_HOME:

## JAVA ##
export JAVA_HOME="/usr/lib/jvm/jdk-11.0.1/bin/java"
export PATH=$PATH:/usr/lib/jvm/jdk-11.0.1/bin

Любые идеи о том, почему работает$ ./gradlew shadowJar не сможет найти Java?

Редактировать

Согласно этот вопрос , который кажется похожим на мой вопрос, моя версия Gradle пытается установить егособственный JAVA_HOME путь, который, как я выяснил, устанавливается на /usr/bin/java/bin/java, который не существует.

В строках 70 - 89 есть if/else оператор делает это enter image description here

1 Ответ

0 голосов
/ 10 декабря 2018

Вместо того, чтобы скрывать решение в комментариях, я создам ответ.Это незначительно по теме, поскольку оно связано не только с тем, как JAVA_HOME установлена ​​в системе Linux / POSIX, но и с тем, как Gradle Wrapper ведет себя иначе, чем данный исполняемый файл Gradle.

Таким образомон связан, но не совсем так, как с этим Q & A, в котором много хороших подсказок .

В двух словах:

  • The GradleОболочка gradlew использует JAVA_HOME, если установлено, в противном случае попытается просто запустить java без JAVA_HOME.Он сообщит об этом консоли и не сможет продолжить.
  • JAVA_HOME - это всегда , ожидается, что будет задан путь, который разрешается в каталог , а не файл .

В этом случае JAVA_HOME было установлено на фактический исполняемый файл JDK Java, и возникли некоторые сомнения относительно альтернатив Linux ""(как несколько пакетов и версий пакетов могут соответствовать системным требованиям) и как они работают с JAVA_HOME.(Большая часть этой путаницы заключалась в том, что я неправильно понял вопрос!)

Это означало, что Gradle Wrapper (в данном случае) пытался вызвать /usr/lib/jvm/jdk-11.0.1/bin/java/bin/java (обратите внимание на двойную ссылку на «bin / java») какJAVA_CMD которого, разумеется, не существует.

Как только мы установим JAVA_HOME в ожидаемое местоположение JDK, Gradle Wrapper успешно запустился.

AFAIK, альтернативная система не имеетлюбые удобства для предоставления JAVA_HOME подобной ссылки на базовое местоположение JDK.Я полагаю, что можно написать сценарий вывода команды alternatives, чтобы получить текущее установленное и активное расположение JDK.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...