即使设置正确,Gradle 也会发现错误的 JAVA_HOME
Posted
技术标签:
【中文标题】即使设置正确,Gradle 也会发现错误的 JAVA_HOME【英文标题】:Gradle finds wrong JAVA_HOME even though it's correctly set 【发布时间】:2014-04-13 23:45:39 【问题描述】:尝试运行 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
或/etc/profile
中没有重复的 JAVA_HOME 定义。
所以我的问题是 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后重启机器?
【参考方案1】:
原来我从 Ubuntu 13.10 存储库下载的特定 Gradle 二进制文件本身试图导出 JAVA_HOME。感谢Lucas 的建议。
/usr/bin/gradle
第 70 行:
export JAVA_HOME=/usr/lib/jvm/default-java
注释掉这一行可以解决问题,并且 Gradle 会找到 Java 二进制文件的正确路径。
如果你只是从他们的website 下载二进制文件就没有这个问题, 这是 Ubuntu 存储库版本的问题。 There also seem to be some other issues with 13.10 version.
【讨论】:
gradle 包似乎将 jdk 安装到此位置,至少在只有默认存储库的 Ubuntu 12.04 LTS 上。我在没有 Java 的 Ubuntu VM 上执行此操作,首先对其进行快照,apt-get install gradle(它安装了近 400 个软件包),并将 java 安装到 /usr/lib/jvm... 还原快照,没有 /usr /lib/jvm。我正在测试导出 JAVA_HOME 的 gradle 脚本的理论,并且确实如此,正如您所发现的那样。 Gradle 不这样做。 ppa 是由其他人提供的,因此您必须询问他们。一般来说,我建议通过 Gradle Wrapper 引导 Gradle,而不是通过包管理器安装它。 我更新了答案,以更清楚地表明问题在于 Ubuntu 存储库版本,而不是 Gradle 本身。 谢谢,我搜索了一个多小时来解决这个问题。感谢这篇文章,它解决了我在 ubuntu 14.04 上的问题 解决您自己的问题的方法(同时解决我的问题)!很遗憾,这个问题已经存在一年了,并且存储库中的 Gradle 脚本还没有更新来解决这个问题。【参考方案2】:添加符号链接
sudo ln -s /usr/lib/jvm/java-7-oracle /usr/lib/jvm/default-java
【讨论】:
@Nar能否提供JAVA的安装路径 感谢您的回答,但 JAVA 的路径并不重要,因为 gradle 脚本会覆盖路径,正如 James ***.com/a/22309017/1679348 对我来说工作得很好。鉴于名称 (default-java),我会说这是一个相当明智的方法。 在我看来,这比更改 Gradle 文件要好得多。 (是的,它对我很有效) 这是非常脆弱的,一旦java升级到下一个版本就会破坏【参考方案3】:解决方案是使 JAVA_HOME == dir 高于 javac 所在的 bin
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上面的bin,所以这样做
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) )))
【讨论】:
【参考方案4】:对我来说,这个错误是由于 Gradle 安装为 sudo 而我试图以默认用户身份运行 Gradle。
试试:
sudo gradle -version
或
sudo gradle -v
【讨论】:
【参考方案5】:在我的 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【参考方案6】:你export
你的JAVA_HOME
了吗?如果没有导出,该设置将不会传播到该 shell 内启动的命令。此外,java -version
不使用 JAVA_HOME
,而是使用在您的路径中找到的第一个 java
。确保您的 .bashrc
看起来像这样:
JAVA_HOME=/path/to/java/home
export JAVA_HOME
【讨论】:
是的,它在 .bashrc 中定义为export JAVA_HOME=/usr/lib/jvm/java-7-oracle
(语法略有不同,但我认为是相同的)
@JamesBarnett,gradle
命令本身可以设置该变量吗?也许安装gradle
的人创建了一个包装脚本,在启动应用程序之前设置环境变量。使用 tomcat 时,catalina.sh
(即启动脚本)调用setenv.sh
设置环境变量的情况并不少见,其中可能包括JAVA_HOME
【参考方案7】:
尝试安装最新版本的gradle
,
sudo add-apt-repository ppa:cwchien/gradle
sudo apt-get update
sudo apt-get install gradle
如果我们从 ubuntu repo 安装,它将安装旧版本,(对我来说是 gradle 1.4)。在旧版本中,它将 gradle 中的 java home 设置为 export JAVA_HOME=/usr/lib/jvm/default-java
。最新版本没有这个问题。
【讨论】:
【参考方案8】:我在 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
最后,你可以运行构建命令了。
【讨论】:
【参考方案9】:我有同样的问题,但我没有在最新版本 2.13 的 gradle 文件的第 70 行找到导出命令,但我明白那里有一个愚蠢的错误,即以下,
如果您在 gradle 文件夹/bin/ 的 gradle 文件中没有找到第 70 行带有导出命令的行,请检查您的 ~/.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
路径中减去它。
这发生在我身上。
【讨论】:
【参考方案10】:我已经在 Manjaro Linux 上对此进行了测试。也应该在其他 Disto 上工作。
对于 java env var,您需要包含整个 java-jdk 目录,而不仅仅是 java/bin。
例如,而不是:
export JAVA_HOME=/opt/jdk-14.0.2/bin
#根据你的jdk位置改变路径
PATH=$PATH:$JAVA_HOME
使用这个:
export JAVA_HOME=/opt/jdk-14.0.2/
#根据你的jdk位置改变路径
PATH=$PATH:$JAVA_HOME
然后运行 gradle 命令就可以了。
【讨论】:
【参考方案11】:您也可以进入 gradle 安装文件夹中的 bin 文件夹,并更正 gradle.bat 文件中的 JAVA_HOME 参数。 就我而言,我的 JAVA_HOME 设置为 c:\Program files\java\bin gradle.bat 中的 JAVA_HOME 设置为 %JAVA_HOME%\bin\java.exe。
我更正了 gradle.bat 中的 JAVA_HOME,它起作用了。
谢谢!!!
【讨论】:
现在是 2019 年,这仍然是个问题!除了它略有不同并且错误变量现在是“set JAVA_EXE=%JAVA_HOME%/bin/java.exe” - 从这里删除 bin 部分进行修复。【参考方案12】:在运行命令之前尝试输入:
export JAVA_HOME="path_to_java_home"
path_to_java_home
是您的bin/java
所在的文件夹。
如果 java 安装正确,您可以使用以下命令找到它的位置:
readlink -f $(which java)
不要忘记从路径末尾删除bin/java
,同时将其放入JAVA_HOME
【讨论】:
【参考方案13】:对我来说,Eclipse 中外部工具配置的参数部分的明确设置是问题所在。
【讨论】:
【参考方案14】: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.
【讨论】:
如果您解释了这个命令的作用以及为什么需要它,这个答案将会得到改进。【参考方案15】:我也有这个问题。正确时它说错误的目录。所以我只是创建了一个名为 JAVA_HOME 的局部变量,省略了最终的 /bin/java。对我来说效果很好。
【讨论】:
【参考方案16】:如果您的 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。)
【讨论】:
【参考方案17】:[Windows] 正如已经说过的,看起来 .bat -file 试图从 %JAVA_HOME%/bin/java.exe
中找到 java.exe,所以它没有找到它,因为 bin
在路径中重复了两次。
从 gradle.bat 中删除额外的 /bin
。
【讨论】:
【参考方案18】:在我的 dockercontainer(最小的找不到 java 的问题)中,没有安装“which”。使用 ./gradlew 中的 gradlew 编译项目以查找 java 安装哪个解决了问题。
【讨论】:
【参考方案19】:在 build.gradle 中添加以下行解决了我的问题。
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
【讨论】:
以上是关于即使设置正确,Gradle 也会发现错误的 JAVA_HOME的主要内容,如果未能解决你的问题,请参考以下文章