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

时间:2014-12-05 15:40:19

标签: java maven java-home

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

14 个答案:

答案 0 :(得分:75)

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

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

这将选择Oracle安装程序定义的正确JAVA_HOME,并将其$PATH设置为bash,确保找到它。

此外,更新Java时无需稍后更改。

修改

根据评论:

  

重启后使其持久化

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

例如:.bash_profile.profileJAVA_HOME(适用于ubuntu)

  

使用自定义Java安装

$()设置为不带JAVA_HOME=/opt/java/openjdk的自定义Java安装路径的根文件夹。

例如:{{1}}

答案 1 :(得分:19)

JAVA_HOME应为/usr/lib/jvm/java-7-oracle/jre/

答案 2 :(得分:14)

我们打开终端并查找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 2015年9月19日/ usr / bin / java - >   的/ etc /替代/ 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 =#&34;在/ usr / local / sbin中:在/ usr / local / bin中:/ usr / sbin目录:在/ usr / bin中:/ sbin目录:/ bin中:在/ usr /游戏:在/ usr /本地/游戏:<强> / usr / lib中/ JVM / JAVA -8- ORACLE / JRE / bin中&#34;   JAVA_HOME =&#34;的 / usr / lib中/ JVM / JAVA -8- ORACLE / JRE &#34;

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

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 home:/ usr / lib / jvm / java-8-oracle / jre
  默认语言环境:es_MX,平台编码:UTF-8
  操作系统名称:&#34; linux&#34;,版本:&#34; 3.16.0-70-generic&#34;,arch:&#34; amd64&#34;,family:&#34; unix&#34;

答案 3 :(得分:9)

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

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

答案 4 :(得分: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

答案 5 :(得分:2)

在我的情况下,你必须占用安装java的整个目录:

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

答案 6 :(得分:2)

设置为导出JAVA_HOME = / usr / java / jdk1.8.0_31。并使用sudo运行它将执行..

答案 7 :(得分:2)

首先,在开发模式中,您应该使用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 :(得分:2)

此解决方案对我有用... 只需输入 终端中的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 :(得分:1)

It happens because of the reason mentioned below :

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

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)

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

  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 JAVACMD variable was not set. So it displays the error.

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

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

答案 10 :(得分:1)

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

答案 11 :(得分:1)

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

答案 12 :(得分:0)

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

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

答案 13 :(得分:0)

我遇到了同样的问题,但是打开了jdk,这里没有答案。问题在于,尝试运行Java命令时,mvn脚本在JAVA主页的末尾附加了/ bin / java。

对我来说,解决方案是手动编辑/usr/local/apache-maven/apache-maven-3.3.9/bin/mvn脚本(您自己的脚本安装可能有所不同;只需运行哪个mvn)并更改< / p>

   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