即使设置正确,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的主要内容,如果未能解决你的问题,请参考以下文章

即使正确初始化,C结构也会打印错误的值

即使选择了文件,也会显示CodeIgniter文件验证

即使创建表的语法正确,我的 sql 中也会出现错误 1064

即使标题正确,POST 调用也会返回 CORS 错误

即使参数正确传递,参数也会错误[重复]

即使设置了正确的尺寸,相机预览也会被拉伸