Gradle发现错误的JAVA_HOME,即使它已正确设置

Jam*_*ett 159 java linux environment-variables gradle

尝试运行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.
Run Code Online (Sandbox Code Playgroud)

但是,当我检查JAVA_HOME变量时,我得到:

# echo $JAVA_HOME 
/usr/lib/jvm/java-7-oracle
Run Code Online (Sandbox Code Playgroud)

我的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)
Run Code Online (Sandbox Code Playgroud)

我还检查了/usr/bin/java符号链接到/etc/alternatives/java哪个正确符号链接到的符号链接/usr/lib/jvm/java-7-oracle/jre/bin/java

另外,我已经检查过.bash_profile或者没有重复的JAVA_HOME定义/etc/profile.

所以我的问题是Gradle如何/为何找到/usr/lib/jvm/default-java,更重要的是我如何将其指向正确的目录?

其他需要JDK工作的程序,所以我认为它是Gradle问题.我也尝试重新安装Gradle,没有任何区别.

我正在运行64位Xubuntu(Ubuntu 13.10基础)

Jam*_*ett 258

事实证明,我从Ubuntu 13.10存储库本身下载的特定Gradle二进制文件试图导出JAVA_HOME.感谢卢卡斯的建议.

/usr/bin/gradle 第70行:

export JAVA_HOME=/usr/lib/jvm/default-java
Run Code Online (Sandbox Code Playgroud)

注释掉这一行解决了这个问题,Gradle找到了Java二进制文件的正确路径.

如果你只是从他们的网站下载二进制文件它没有这个问题,这是Ubuntu repo版本的一个问题.13.10版本似乎还有其他一些问题.

  • 谢谢,我搜索了一个多小时来解决这个问题.感谢这篇文章,它解决了我在ubuntu 14.04上的问题 (11认同)
  • Gradle不这样做.ppa是由其他人提供的,所以你必须问他们.一般来说,我建议通过Gradle Wrapper引导Gradle,而不是通过包管理器安装它. (2认同)

Sha*_*shi 48

添加符号链接

sudo ln -s /usr/lib/jvm/java-7-oracle /usr/lib/jvm/default-java
Run Code Online (Sandbox Code Playgroud)

  • 工作对我来说很好.鉴于名称(*default-java*),我认为这是一种相当明智的方法. (5认同)
  • 在我看来,这是比更改Gradle文件更好的解决方案.(是的,它对我很有用) (2认同)

Sco*_*and 21

解决方案是让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
Run Code Online (Sandbox Code Playgroud)

好的,所以终于在实际的javac上面找到了bin,所以这样做

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
Run Code Online (Sandbox Code Playgroud)

以上可以简化并推广到

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)  )))
Run Code Online (Sandbox Code Playgroud)


Jyo*_*ash 12

对我来说,这个错误是由于Gradle安装为sudo而我尝试作为默认用户运行Gradle的原因.

尝试:

sudo gradle -version
Run Code Online (Sandbox Code Playgroud)

要么

sudo gradle -v
Run Code Online (Sandbox Code Playgroud)


Moh*_*eer 7

尝试安装最新版本gradle,

sudo add-apt-repository ppa:cwchien/gradle

sudo apt-get update

sudo apt-get install gradle
Run Code Online (Sandbox Code Playgroud)

如果我们从ubuntu repo安装,它将安装旧版本,(对我而言,它是gradle 1.4).在旧版本中,它将java home从gradle设置为export JAVA_HOME=/usr/lib/jvm/default-java.最新版本没有这个问题.


Luc*_*cas 6

exportJAVA_HOME吗?如果没有导出,设置将不会传播到在该 shell 内启动的命令。此外,java -version不使用JAVA_HOME,而是使用java在您的路径中找到的第一个。确保你.bashrc看起来像这样:

JAVA_HOME=/path/to/java/home
export JAVA_HOME
Run Code Online (Sandbox Code Playgroud)

  • @JamesBarnett,`gradle` 命令本身可以设置该变量吗?也许安装 `gradle` 的人创建了一个包装脚本,在启动应用程序之前设置环境变量。使用 tomcat 时,`catalina.sh`(它是启动脚本)调用 `setenv.sh` 来设置环境变量的情况并不少见,其中可能包括 `JAVA_HOME` (3认同)

MJ *_*tes 6

在我的 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
Run Code Online (Sandbox Code Playgroud)

步骤 2. 记下路径: /usr/lib/jvm/java-8-openjdk-amd64/bin/java

排除 bin/java

你的 JAVA_HOME = /usr/lib/jvm/java-8-openjdk-amd64


小智 5

当我在 Ubuntu 上运行以下命令时遇到了这个问题:

ionic build android
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题,我执行了以下步骤:

ln -sf /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java /usr/lib/jvm/default-java
Run Code Online (Sandbox Code Playgroud)

将 JAVA_HOME 添加到 /etc/environment:

vi /etc/environment
Run Code Online (Sandbox Code Playgroud)

添加:

JAVA_HOME="/usr/lib/jvm/default-java"
Run Code Online (Sandbox Code Playgroud)

保存后,阅读:

source /etc/environment
Run Code Online (Sandbox Code Playgroud)

最后,您可以运行构建命令。


小智 5

我遇到了同样的问题,但是我没有在最新版本 2.13 的 gradle 文件中的第 70 行中找到导出命令,但我理解那里有一个愚蠢的错误,如下所示,

如果在 gradle 文件夹/bin/ 中的 gradle 文件中没有找到带有 export 命令的第 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
Run Code Online (Sandbox Code Playgroud)

这意味着 /bin/java已经存在,因此需要从JAVA_HOME路径中减去它。

我的情况就是这样。