【问题标题】:Gradle finds wrong JAVA_HOME even though it's correctly set即使设置正确,Gradle 也会发现错误的 JAVA_HOME
【发布时间】: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后重启机器?

标签: java linux gradle environment-variables


【解决方案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 stackoverflow.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
                          

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 2017-06-04
                            • 2018-05-03
                            • 2018-06-07
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2016-03-25
                            • 2020-09-04
                            相关资源
                            最近更新 更多