簡體   English   中英

運行“ ./gradlew shadowJar”時,Gradle無法找到Java

[英]Gradle can't locate Java when running “./gradlew shadowJar”

我正在嘗試構建一個包含用於JDBCMySQL driverjar文件。 到目前為止,我有一個非常基本的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 ,而該路徑不存在。

在第70-89行,有一個if/else語句在執行此操作 在此處輸入圖片說明

我將創建一個答案,而不是在注釋中隱藏解決方案。 這幾乎是話題,因為它不僅與在Linux / POSIX系統上如何JAVA_HOME有關,而且還與Gradle Wrapper與給定的Gradle可執行文件的行為方式不同。

通過這種方式,它與該問答相關但並不完全相同, 問答中有很多不錯的提示

簡而言之:

  • Gradle Wrapper 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM