即使设置正确,Gradle也会发现错误的JAVA_HOME


168

尝试运行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或中没有重复的JAVA_HOME定义/etc/profile

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

其他需要JDK的程序也可以正常工作,因此我认为这是Gradle问题。我也尝试过重新安装Gradle,这没有什么区别。

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


请提供完整的错误输出。就目前而言,不清楚消息的来源。另外,您是否有/usr/lib/jvm/default-java目录或符号链接?以及如何安装Gradle?
Peter Niederwieser 2014年

我已经更新了Q,但这几乎是完整的错误输出。没有/usr/lib/jvm/default-java目录。与apt一起安装(apt-get install gradle)
James Barnett

无需JAVA_HOME设置Gradle启动脚本。如果JAVA_HOME设置为,则脚本用于$JAVA_HOME/bin/java运行Gradle。否则,它将使用java(即java必须位于上PATH)。也许(第三方)apt软件包使用了经过修改的启动脚本。
Peter Niederwieser 2014年

是的,无论我从二进制文件中获得的ppa都经过硬编码,并将JAVA_HOME导出到usr/lib/jvm/defult-java。感谢您的帮助
James Barnett 2014年

source ~/.bashrc设置JAVA_HOME后,您是否做过,或重新启动了计算机?
IgorGanapolsky

Answers:


263

原来,我从Ubuntu 13.10存储库中下载的特定Gradle二进制文件本身尝试导出JAVA_HOME。感谢卢卡斯的建议。

/usr/bin/gradle 第70行:

export JAVA_HOME=/usr/lib/jvm/default-java

注释掉该行即可解决问题,Gradle会找到指向Java二进制文件的正确路径。

如果仅从他们的网站下载二进制文件,则不会出现此问题,这是Ubuntu回购版本的问题。13.10版本似乎还存在其他一些问题。


gradle软件包似乎将jdk安装到该位置,至少在仅具有默认存储库的Ubuntu 12.04 LTS上。我是在没有Java的Ubuntu VM上执行此操作的,首先对其进行了快照,apt-get install gradle(安装了将近400个软件包),然后将java安装到了/ usr / lib / jvm ...恢复了快照,没有/ usr / lib / jvm。正如您所发现的,我正在测试gradle脚本导出JAVA_HOME的理论,的确如此。
约书亚·麦金农

2
Gradle不会这样做。PPA由其他人提供,因此您必须询问他们。通常,我建议通过Gradle Wrapper引导Gradle,而不是通过程序包管理器进行安装。
Peter Niederwieser 2014年

我更新了答案,以使您更清楚地知道Ubuntu repo版本是问题所在,而不是Gradle本身。
James Barnett

11
谢谢,我搜索了一个多小时,以解决此问题。感谢您的发布,它解决了我在ubuntu 14.04上遇到的问题
Kay Schneider

1
解决您自己的问题的方法(和同时解决)!可惜的是,这个问题已经存在了一年,而存储库中的Gradle脚本尚未更新以解决此问题。
sotrh 2015年

49

添加符号链接

sudo ln -s /usr/lib/jvm/java-7-oracle /usr/lib/jvm/default-java

@Nar能否请您提供JAVA的安装路径
Shashi

谢谢你的回答,但因为剧本的gradle覆盖路径詹姆斯说JAVA的路径并不重要stackoverflow.com/a/22309017/1679348
全国房地产经纪人协会

5
对我来说很好。给定名称(default-java),我想说这是一种相当明智的方法。
Phil

2
我认为这是比更改Gradle文件更好的解决方案。(是的,它对我来说很好)
zorglub76

谢谢你,先生!你节省了我的时间!
AlexKh

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

好的,所以终于找到了实际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)  )))


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。最新版本没有这个问题。


5

是你exportJAVA_HOME吗?如果不导出,则该设置将不会传播到该Shell内部启动的命令。另外,java -version不使用JAVA_HOME,而是使用java您在路径中找到的第一个。确保您的.bashrc外观如下所示:

JAVA_HOME=/path/to/java/home
export JAVA_HOME

1
是的,其在.bashrc中的定义为export JAVA_HOME=/usr/lib/jvm/java-7-oracle(语法略有不同,但我认为相同)
James Barnett 2014年

3
@JamesBarnett,gradle命令本身可以设置该变量吗?也许安装人员gradle创建了一个包装器脚本,用于在启动应用程序之前设置环境变量。使用tomcat时,catalina.sh(这是启动脚本)调用a setenv.sh来设置环境变量并不罕见,其中可能包括JAVA_HOME
Lucas

4

在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

最后,您可以运行build命令。


4

我遇到了同样的问题,但是在最新版本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,并在path >>>中将其删除这样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路径中减去。

以我为例。


4

在我的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
Borjante


2

您也可以转到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部分以进行修复。
安迪·洛伦兹

2
sudo ln -s /usr/lib/jvm/java-7-oracle/jre /usr/lib/jvm/default-java

创建一个指向默认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.

如果您解释了此命令的作用以及为什么需要此命令,则可以改善此答案。
伊恩·麦克劳德

2

在运行命令之前,请尝试输入:

export JAVA_HOME="path_to_java_home"

哪里path_to_java_home是你的文件夹bin/java是。

如果正确安装了Java,则可以使用以下命令找到其位置:

readlink -f $(which java)

bin/java将路径放入路径时,别忘了从路径的末端删除JAVA_HOME


1

我也有这个问题。正确时说目录错误。因此,我只创建了一个名称为JAVA_HOME的局部变量,省略了最后的/ bin / java。对我来说很好。


1

如果正确设置了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。)


0

在我的dockercontainer中(至少没有找到java的问题)是,未安装“哪个”。使用gradlew组合项目,该项目在./gradlew中使用了它来查找java Installation,从而解决了该问题。


0

[Windows]如前所述,.bat -file试图从中查找java.exe,%JAVA_HOME%/bin/java.exe因此找不到它,因为bin在路径中重复了两次。/bin从gradle.bat中删除多余的部分。

摇篮


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.