繁体   English   中英

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

[英]Error: JAVA_HOME is not defined correctly executing maven

我安装了 java 并设置了路径环境,当我在终端中运行echo $JAVA_HOME时,我得到以下 output:

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

我还安装了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

但是当我执行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

假设您使用 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

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

我们打开一个终端,寻找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”,arch:“amd64”,系列:“unix”

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

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

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

首先找到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

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

例子

sudo mvn -v

输出

Apache Maven 3.6.0
Maven home: /usr/share/maven
Java version: 11.0.10, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "5.4.0-70-generic", arch: "amd64", family: "unix"

首先,在开发模式下,你应该使用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 将访问 add bin/java 然后它会工作得很好。

这个解决方案对我export PATH=$JAVA_HOME/jre/bin:$PATH ......只需在终端中输入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

并且错误得到解决。 注意:将您自己的机器显示的路径粘贴到 export JAVA_HOME 的 mvn log 中。

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

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

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

如果您看到 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

Step3:发生这种情况是因为未设置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 ( save-buffers-kill-terminal )。

如果您使用的是 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

其中/usr/libexec/java_home是您的 jvm 的路径

使用这两个命令(对于 Java 8):

sudo update-java-alternatives --set java-8-oracle
java -XshowSettings 2>&1 | grep -e 'java.home' | awk '{print "JAVA_HOME="$3}' | sed "s/\/jre//g" >> /etc/environment

就我而言,问题出在 vscode 中。

我使用windows并在我的计算机上安装了Ubuntu,因此vscode终端使用Ubuntu。 我只是去 settings.json 并再次更改为 cmd.exe

我遇到了同样的问题,但是使用了开放式 jdk,这里的所有答案都没有帮助。 问题是 mvn 脚本在尝试运行 java 命令时在 JAVA home 的末尾附加了 /bin/java 。

我的解决方案是手动编辑 /usr/local/apache-maven/apache-maven-3.3.9/bin/mvn 脚本(您自己的脚本可能安装不同;只需运行 which mvn)并更改

   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 [ -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"
    fi
  else
    JAVACMD="`which java`"
  fi
fi

添加.bash_profile

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$JAVA_HOME/jre/bin:$PATH

接着

source.bash_profile

我有类似的问题,即使在编辑和获取 .bash_profile、.bashrc 文件后也没有得到解决。 我通过直接编辑 maven.sh 文件解决了它。

export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.16.0.8-1.amzn2.0.1.x86_64
export M2_HOME=/opt/maven
export M2=/opt/maven/bin
export PATH=$PATH:$HOME/bin:$JAVA_HOME:$M2HOME:$M2

然后获取文件

source /etc/profile.d/maven.sh

对于那些没有通过其他答案解决问题的人,也可以尝试一下。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM