【问题标题】:Error: JAVA_HOME is not defined correctly executing maven错误:未正确定义 JAVA_HOME 执行 maven
【发布时间】:2015-02-03 20:03:52
【问题描述】:

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

/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

【问题讨论】:

  • 可以使用sdkman轻松管理java和maven工具。
  • 在我的例子中,问题是 JAVA_HOME 是在 $HOME/.mavenrc 中定义的,它指向了错误的路径。我能够通过在 /usr/local/bin/mvn 脚本中添加一些 echo $JAVA_HOME 行并运行 mvn -v 来找出问题

标签: java maven java-home


【解决方案1】:

假设您使用 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 时也不需要更改。

编辑

根据 cmets:

重启后使其持久化

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

例如:.bashrc.bash_profile.profile(适用于 ubuntu)

使用自定义 Java 安装

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

例如:JAVA_HOME=/opt/java/openjdk

【讨论】:

  • 如果我想在两次启动之间保持这种状态怎么办?
  • 值得注意的是,对于 ubuntu,你应该使用 .profile 而不是 .bash_profile 根据askubuntu.com/questions/824829/…
  • 如果我想使用共享中的 java 而不是系统 java 怎么办
  • 刚刚根据 cmets 更新了答案。谢谢。
  • 谢谢!只是出于好奇,为什么“JAVA_HOME=/opt/java/openjdk”有效,但“JAVA_HOME=$(/usr/libexec/java_home)”不适用于自定义 Java 安装?
【解决方案2】:

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

【讨论】:

  • 对了,你需要把路径后面的“/bin/java”去掉..意思是:JAVA_HOME="/usr/lib/jvm/java-7-oracle/jre/"跨度>
【解决方案3】:

我们打开一个终端,寻找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 根 2015 年 5 月 19 日 22 日 /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,供应商:甲骨文公司
Java 主页:/usr/lib/jvm/java-8-oracle/jre
默认语言环境:es_MX,平台编码:UTF-8
操作系统名称:“linux”,版本:“3.16.0-70-generic”,arch:“amd64”,家族:“unix”

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

        你应该设置为导出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”,arch:“amd64”,家族:“unix”
        

        【讨论】:

        • 这在 debian 上对我有用! (手动安装JDK)
        • sudo 解决了我的问题。我的JAVA_HOME 是正确的,但我看到了同样的错误。
        【解决方案7】:

        首先,在开发模式下,你应该使用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 然后它就可以正常工作了。

        【讨论】:

          【解决方案8】:

          这个解决方案对我有用... 只需键入 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
          

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

          【讨论】:

            【解决方案9】:

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

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

            【讨论】:

              【解决方案10】:

              它的发生是因为下面提到的原因:

              如果你看到 mvn 脚本:这里的代码失败 ---

              调试和修复步骤:

              第一步:打开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
              

              第 3 步:这是因为未设置 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 )。

              【讨论】:

                【解决方案11】:

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

                【讨论】:

                  【解决方案12】:

                  使用这两个命令(对于 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
                  

                  【讨论】:

                    【解决方案13】:

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

                    我使用windows并在我的电脑上安装了Ubuntu,所以vscode终端使用的是Ubuntu。我只是去 settings.json 并再次更改为 cmd.exe

                    【讨论】:

                      【解决方案14】:

                      我遇到了同样的问题,但是使用开放的 jdk,这里的答案都没有帮助。问题是 mvn 脚本在尝试运行 java 命令时将 /bin/java 附加到 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
                      

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 2016-08-10
                        • 1970-01-01
                        • 2018-02-14
                        • 2013-03-18
                        • 2017-11-24
                        • 1970-01-01
                        相关资源
                        最近更新 更多