错误:执行maven时JAVA_HOME定义不正确

81

我安装了Java并设置了路径环境变量,在终端中运行echo $JAVA_HOME后,输出如下:

/usr/lib/jvm/java-7-oracle/jre/bin/java

我还安装了apache-maven并更改了环境文件,现在它看起来像这样:

JAVA_HOME="/usr/lib/jvm/java-7-oracle/jre/bin/java"
M2_HOME=/usr/local/apache-maven/apache-maven-3.0.5
M2=$M2_HOME/bin
MAVEN_OPTS="-Xms256m -Xmx512m"
PATH=$M2:$PATH

但是当我执行 mvn --version 命令时,我收到一个警告:

Error: JAVA_HOME is not defined correctly.
  We cannot execute /usr/lib/jvm/java-7-oracle/jre/bin/java/bin/java

无法找出为什么它在结尾处重复了 /bin/java/bin/java


可以使用sdkman轻松管理Java和Maven工具。 - Rishikesh Darandale
在我的情况下,问题是JAVA_HOME在$HOME/.mavenrc中被定义,并且指向了错误的路径。我通过在/usr/local/bin/mvn脚本中添加一些echo $JAVA_HOME行并运行mvn -v来找出问题。 - hetptis
17个回答

107
假设你使用的是 bash shell 并且使用 Oracle 安装程序安装了 Java,那么你可以将以下内容添加到你的 .bash_profile 文件中。
export JAVA_HOME=$(/usr/libexec/java_home)
export PATH=$JAVA_HOME/jre/bin:$PATH

这将选择由Oracle安装程序定义的正确的JAVA_HOME,并将其设置为您$PATH中的第一个,以确保能够找到它。

此外,当更新Java时,您无需更改它。

编辑

根据评论:

在重新启动后使其持久化

只需将这些行添加到shell配置文件中。(假设是bash

例如:.bashrc.bash_profile.profile(对于ubuntu)

使用自定义Java安装

JAVA_HOME设置为自定义Java安装路径的根文件夹,不需要$()

例如: JAVA_HOME=/opt/java/openjdk


1
如果我想让这个在启动之间保持不变怎么办? - IgorGanapolsky
2
值得注意的是,在Ubuntu中,根据http://askubuntu.com/questions/824829/creating-and-configuring-bash-profile,您应该使用.profile而不是.bash_profile。 - Pierre
1
如果我想从共享中使用Java而不是系统Java怎么办? - Wearybands
根据评论刚刚更新了答案。谢谢。 - rbento
谢谢!只是出于好奇,为什么“JAVA_HOME=/opt/java/openjdk”适用于自定义Java安装,但“JAVA_HOME=$(/usr/libexec/java_home)”不适用? - zero_yu

24

JAVA_HOME 应该是/usr/lib/jvm/java-7-oracle/jre/


3
好的,你需要从你的路径中删除结尾的“/bin/java”...意思是:JAVA_HOME="/usr/lib/jvm/java-7-oracle/jre/" - dariusz

22

我们打开终端并查找Java的位置:

manuel@zonademanel:~ → whereis java

Java所在路径:/usr/bin/java /etc/java /usr/bin/X11/java /usr/share/java /usr/share/man/man1/java.1.gz

我们需要查找的是/usr/bin/java,继续在命令行中查找其绝对路径,因为这只是一个符号链接。

manuel@zonademanel:~ → ls -lah /usr/bin/java

lrwxrwxrwx 1 root root 22 may 19 2015 /usr/bin/java -> /etc/alternatives/java

manuel@zonademanel:~ → ls -lah /etc/alternatives/java

lrwxrwxrwx 1 root root 39 dic 7 11:52 /etc/alternatives/java -> /usr/lib/jvm/java-8-oracle/jre/bin/java

我修改了/etc/environment文件,加入以下值:

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/jvm/java-8-oracle/jre/bin" JAVA_HOME="/usr/lib/jvm/java-8-oracle/jre"

如果我不想重新登录,可以使用以下命令重新加载更改:

source /etc/environment 

正确运行 mvn -version

manuel@zonademanel:~ → mvn -version

Apache Maven是一款软件工程管理和自动构建工具,版本号为3.0.5。上述信息展示了Maven的安装位置(/usr/share/maven)、Java版本(1.8.0_77,Oracle Corporation提供)、Java安装位置(/usr/lib/jvm/java-8-oracle/jre)、默认语言环境(es_MX)、平台编码(UTF-8)、操作系统类型(linux)、版本(3.16.0-70-generic)、架构(amd64)以及家族(unix)。

9

$JAVA_HOME 应该是 Java 安装文件的目录,而不是其中的某个部分:

export JAVA_HOME=/usr/lib/jvm/java-7-oracle

9

您可能会因为几个原因而遇到此错误。为了快速解决此问题,请按照以下步骤操作:

首先找到Java的位置。要获取已安装的Java平台列表,请从终端运行以下命令:

$ sudo update-alternatives --config java

现在设置JAVA_HOME和PATH,
$ export JAVA_HOME=<java_home>

$ export PATH=$JAVA_HOME/jre/bin:$PATH

创建符号链接。
$ sudo ln -s <java_home>/jre <java_symlink_path>

当我们以您的案例为例时:
$ sudo ln -s /usr/lib/jvm/java-7-oracle/jre /usr/lib/jvm/java-7-oracle/jre/bin/java

上述命令将创建符号链接位置,该位置是系统在您的问题中尝试查找的位置。
最后执行。
$ mvn --version

1
绝对传奇 - Kimanthi K.

6

您应该将其设置为export JAVA_HOME=/usr/java/jdk1.8.0_31并使用sudo运行,它将执行如下所示。

示例

sudo mvn -v

输出

Apache Maven 3.6.0
Maven主目录:/usr/share/maven
Java版本:11.0.10,供应商:Ubuntu,运行时路径:/usr/lib/jvm/java-11-openjdk-amd64
默认区域设置:en_US,平台编码:UTF-8
操作系统名称:"linux",版本:"5.4.0-70-generic",架构:"amd64",家族:"unix"

这是我在Debian上成功的做法!(手动安装JDK) - timmz
2
sudo 解决了我的问题。我的 JAVA_HOME 是正确的,但我仍然看到相同的错误。 - mmdemirbas

3

首先,在开发模式下,应该使用JDK而不是JRE。

其次,JAVA_HOME是你安装Java的地方,所有其他框架也会在其中搜索它们所需的内容(如JRE、javac等)。

因此,如果你设置

JAVA_HOME=/usr/lib/jvm/java-7-oracle/jre/bin/java

当你运行"mvn"命令时,Maven将尝试通过添加/bin/java来访问Java,认为JAVA_HOME位于Java安装的根目录中。

但是,设置

JAVA_HOME=/usr/lib/jvm/java-7-oracle/

Maven会添加bin/java,然后它会正常工作。


3

这个解决方案对我很有用... 只需要在终端输入以下命令:export PATH=$JAVA_HOME/jre/bin:$PATH 然后运行mvn -version 它会显示相同的错误,但是会附带一个日志,类似于这样:

which: no javac in (/jre/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/puppetlabs/bin)
Warning: JAVA_HOME environment variable is not set.
Apache Maven 3.2.5 (12a6b3acb947671f09b81f49094c53f426d8cea1; 2014-12-14T22:59:23+05:30)
Maven home: /opt/apache-maven-3.2.5
Java version: 1.8.0_171, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.171-8.b10.el7_5.x86_64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-693.el7.x86_64", arch: "amd64", family: "unix"

现在复制Java home路径,例如/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.171-8.b10.el7_5.x86_64/jre(本例中)。

现在输入,

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.171-8.b10.el7_5.x86_64/jre

并且错误得到解决。 注意:在mvn日志中,粘贴您自己机器显示的路径以导出JAVA_HOME。


2

出现这种情况的原因如下:

如果您查看mvn脚本:代码在此处失败 ---

调试和修复步骤:

步骤1:打开mvn脚本 /Users/Username/apache-maven-3.0.5/bin/mvn (使用less命令打开,如:less /Users/Username/apache-maven-3.0.5/bin/mvn)

步骤2:在脚本中找到以下代码:

  if [ -z "$JAVACMD" ] ; then
  if [ -n "$JAVA_HOME"  ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
      # IBM's JDK on AIX uses strange locations for the executables
      JAVACMD="$JAVA_HOME/jre/sh/java"
    else
      JAVACMD="$JAVA_HOME/bin/java"
    fi
  else
    JAVACMD="`which java`"
  fi
fi

if [ ! -x "$JAVACMD" ] ; then
  echo "Error: JAVA_HOME is not defined correctly."
  echo "  We cannot execute $JAVACMD"
  exit 1
fi

步骤三:发生这种情况是因为JAVACMD变量未设置。因此,它会显示错误信息。

注意:要修复它

export JAVACMD=/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/bin/java

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/

关键字:如果您想让它永久生效,请打开emacs .profile

输入命令并按Ctrl-x Ctrl-c(保存缓冲区并退出终端)。


2

您必须拿到Java安装目录下的整个文件夹,例如在我的情况下:

export JAVA_HOME=/usr/java/jdk1.8.0_31

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接