错误:JAVA_HOME 未正确定义执行 maven

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/27319495/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 04:10:08  来源:igfitidea点击:

Error: JAVA_HOME is not defined correctly executing maven

javamavenjava-home

提问by user3127896

I installed java and set path to environment and when I execute echo $JAVA_HOMEI get the following output:

我安装了 java 并设置了环境路径,当我执行时,echo $JAVA_HOME我得到以下输出:

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

I Also installed apache-mavenand changed environmentfile and now it looks like this:

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

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

But when I execute mvn --versionI get a warning:

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

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

Can not find out why it repeats in the end /bin/java/bin/java

不知道为什么最后会重复 /bin/java/bin/java

采纳答案by rbento

Assuming you use bash shell and installed Java with the Oracle installer, you could add the following to your .bash_profile

假设您使用 bash shell 并使用 Oracle 安装程序安装了 Java,您可以将以下内容添加到您的 .bash_profile

export JAVA_HOME=$(/usr/libexec/java_home)
export PATH=$JAVA_HOME/jre/bin:$PATH

This would pick the correct JAVA_HOMEas defined by the Oracle installer and will set it first in your $PATHmaking sure it is found.

这将选择JAVA_HOMEOracle 安装程序定义的正确值,并将首先设置它以$PATH确保找到它。

Also, you don't need to change it later when updating Java.

此外,您以后在更新 Java 时不需要更改它。

EDIT

编辑

As per the comments:

根据评论:

Making it persistent after a reboot

重新启动后使其持久化

Just add those lines in the shell configuration file. (Assuming it's bash)

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

Ex: .bashrc, .bash_profileor .profile(for ubuntu)

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

Using a custom Java installation

使用自定义 Java 安装

Set JAVA_HOMEto the root folder of the custom Java installation path without the $().

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

Ex: JAVA_HOME=/opt/java/openjdk

前任: JAVA_HOME=/opt/java/openjdk

回答by talex

JAVA_HOME should be /usr/lib/jvm/java-7-oracle/jre/.

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

回答by Mureinik

$JAVA_HOMEshould be the directory where java was installed, not one of its parts:

$JAVA_HOME应该是安装 java 的目录,而不是它的一部分:

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

回答by trenixjetix

You must take the whole directory where java is installed, in my case:

在我的情况下,您必须获取安装 java 的整个目录:

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

回答by rohit sawant

set as it is export JAVA_HOME=/usr/java/jdk1.8.0_31.and run with sudo it will execute..

设置为 export JAVA_HOME=/usr/java/jdk1.8.0_31.and 用 sudo 运行它会执行..

回答by Jad B.

Firstly, in a development mode, you should use JDK instead of the JRE. Secondly, the JAVA_HOME is where you install Java and where all the others frameworks will search for what they need (JRE,javac,...)

首先,在开发模式下,你应该使用JDK而不是JRE。其次,JAVA_HOME 是您安装 Java 的地方,也是所有其他框架将搜索所需内容的地方(JRE、javac 等)

So if you set

所以如果你设置

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

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

when you run a "mvn" command, Maven will try to access to the java by adding /bin/java, thinking that the JAVA_HOME is in the root directory of Java installation.

当你运行“mvn”命令时,Maven会尝试通过添加/bin/java来访问java,认为JAVA_HOME在Java安装的根目录下。

But setting

但设置

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

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

Maven will access add bin/java then it will work just fine.

Maven 将访问 add bin/java 然后它会工作得很好。

回答by Juan Manuel Garcia Carmona

We open a terminal and look for the location of java:

我们打开一个终端,寻找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

java: /usr/bin/java /etc/java /usr/bin/X11/java /usr/share/java /usr/share/man/man1/java.1.gz

What we are looking for is /usr/bin/java continue on the command line to find the absolute path , as this is only a symbolic link.

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

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

lrwxrwxrwx 1 root root 22 may 19 2015 /usr/bin/java -> /etc/alternatives/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

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

I modified my /etc/environmentfile with the following values

我使用以下值修改了我的/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"

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"

If I do not want to relogin I can reload the changes with:

如果我不想重新登录,我可以重新加载更改:

source /etc/environment 

??And run mvn -versioncorrectly

??并正确运行mvn -version

manuel@zonademanel:~ → mvn -version

Apache Maven 3.0.5
Maven home: /usr/share/maven
Java version: 1.8.0_77, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-8-oracle/jre
Default locale: es_MX, platform encoding: UTF-8
OS name: "linux", version: "3.16.0-70-generic", arch: "amd64", family: "unix"

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”,arch:“amd64”,系列:“unix”

回答by tk_

You might get this error due to couple of reasons. To fix this quickly please follow below steps,

由于几个原因,您可能会收到此错误。要快速解决此问题,请按照以下步骤操作,

First find the java location. To get a list of your installed Java platforms, run the following command from the terminal:

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

$ sudo update-alternatives --config java

Now set JAVA_HOME and PATH,

现在设置 JAVA_HOME 和 PATH,

$ export JAVA_HOME=<java_home>

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

Create the symlink

创建符号链接

$ sudo ln -s <java_home>/jre <java_symlink_path>

When we take your case as a example :

当我们以您的案例为例时:

$ sudo ln -s /usr/lib/jvm/java-7-oracle/jre /usr/lib/jvm/java-7-oracle/jre/bin/java

Above command will create the symlink location where the system is trying to find in your issue.

上面的命令将创建系统试图在您的问题中找到的符号链接位置。

Finally do the

最后做

$ mvn --version

回答by Shubham Verma

It happens because of the reason mentioned below :

发生这种情况是因为下面提到的原因:

If you see the mvn script: The code fails here ---

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

Steps for debugging and fixing:

调试和修复步骤:

Step 1: Open the mvn script /Users/Username/apache-maven-3.0.5/bin/mvn (Open with the less command like: less /Users/Username/apache-maven-3.0.5/bin/mvn)

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

Step 2: Find out the below code in the script:

第 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

Step3: It is happening because JAVACMDvariable was not set. So it displays the error.

第3步:这是因为JAVACMD未设置变量而发生的。所以它显示错误。

Note: To Fix it

注意:修复它

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/

Key: If you want it to be permanent open emacs .profile

关键:如果你想让它永久打开 emacs .profile

post the commands and press Ctrl-x Ctrl-c ( save-buffers-kill-terminal ).

发布命令并按 Ctrl-x Ctrl-c ( save-buffers-kill-terminal )。

回答by ishanbakshi

If you are using mac-OS , export JAVA_HOME=/usr/libexec/java_homeneed to be changed to export JAVA_HOME=$(/usr/libexec/java_home). Steps to do this :

如果您使用的是 mac-OS ,则export JAVA_HOME=/usr/libexec/java_home需要更改为export JAVA_HOME=$(/usr/libexec/java_home). 执行此操作的步骤:

 $ vim .bash_profile

 export JAVA_HOME=$(/usr/libexec/java_home)

 $ source .bash_profile

where /usr/libexec/java_homeis the path of your jvm

/usr/libexec/java_home你的jvm的路径在哪里