![](/img/trans.png)
[英]./gradlew The operation couldn’t be completed. Unable to locate a Java Runtime
[英]Gradle can't locate Java when running “./gradlew shadowJar”
我正在嘗試構建一個包含用於JDBC
的MySQL driver
的jar
文件。 到目前為止,我有一個非常基本的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.
當嘗試使用$ which java
獲得Java時找到Java
/usr/bin/java
和$ ls -la /usr/bin | grep -i javaj
我收到$ 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
,而該路徑不存在。
我將創建一個答案,而不是在注釋中隱藏解決方案。 這幾乎是話題,因為它不僅與在Linux / POSIX系統上如何JAVA_HOME
有關,而且還與Gradle Wrapper與給定的Gradle可執行文件的行為方式不同。
通過這種方式,它與該問答相關但並不完全相同, 問答中有很多不錯的提示 。
簡而言之:
gradlew
如果設置了JAVA_HOME
則使用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位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.