为什么`mvn`显示`Java version:9.0.1`,而我当前的`java`命令是`1.8.0_151`?

时间:2018-01-22 03:26:17

标签: java maven

我想知道为什么mvn显示Java version: 9.0.1,而我当前的java命令是1.8.0_151?感谢。

$ mvn --version
Apache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T03:58:13-04:00)
Maven home: /home/t/program_files/programming/Maven/apache-maven-3.5.2
Java version: 9.0.1, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-9-oracle
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.13.0-26-generic", arch: "amd64", family: "unix"

$ java -version
java version "1.8.0_151"
Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)

请注意,我已经安装了java 8和java 9:

$ update-alternatives --config javac
There are 2 choices for the alternative javac (providing /usr/bin/javac).

  Selection    Path                                  Priority   Status
------------------------------------------------------------
  0            /usr/lib/jvm/java-9-oracle/bin/javac   1091      auto mode
* 1            /usr/lib/jvm/java-8-oracle/bin/javac   1081      manual mode
  2            /usr/lib/jvm/java-9-oracle/bin/javac   1091      manual mode

$ update-alternatives --config java
There are 2 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                     Priority   Status
------------------------------------------------------------
  0            /usr/lib/jvm/java-9-oracle/bin/java       1091      auto mode
* 1            /usr/lib/jvm/java-8-oracle/jre/bin/java   1081      manual mode
  2            /usr/lib/jvm/java-9-oracle/bin/java       1091      manual mode

$ which java
/usr/bin/java
$ readlink -f /usr/bin/java
/usr/lib/jvm/java-8-oracle/jre/bin/java

并且$PATH中唯一的部分是

/usr/lib/jvm/java-8-oracle/bin:
/usr/lib/jvm/java-8-oracle/db/bin:
/usr/lib/jvm/java-8-oracle/jre/bin

$ echo $JAVA_HOME
/usr/lib/jvm/java-9-oracle/

我不太了解的解决方案:

$ export JAVA_HOME=/usr/lib/jvm/java-8-oracle/
$ mvn --version
Apache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T03:58:13-04:00)
Maven home: /home/t/program_files/programming/Maven/apache-maven-3.5.2
Java version: 1.8.0_151, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-8-oracle/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.13.0-26-generic", arch: "amd64", family: "unix"

mvn仅依赖JAVA_HOME,而java不依赖吗?

3 个答案:

答案 0 :(得分:2)

  

为什么Java version: 9.0.1显示java,而我当前的1.8.0_151命令是java

简短的回答是因为您安装了两个不同版本的Java。从命令行键入mvn时,它使用一个版本。 java找到另一个版本。

您可以通过输入

查看使用了哪个which java 可执行文件
mvn

/usr/lib/jvm/java-9-oracle的输出显示它正在使用PATH处安装的JDK。

命令行使用echo $PATH 环境变量在您键入命令时搜索可执行文件。您可以通过键入

来查看它的值
PATH

如果Java 8和Java 9的两个目录都出现在PATH中,那么shell将使用找到的第一个目录。您可以调整{{1}}的顺序,但最好只删除默认情况下不想使用的那个。

答案 1 :(得分:2)

  

mvn是否仅依赖于JAVA_HOME,而java则不依赖?

是的,maven使用$JAVA_HOME环境变量来查找java安装,而终端总是引用$PATH来查找系统中的可执行文件。

  

PATH是类Unix操作系统,DOS,OS / 2和Microsoft Windows的环境变量,指定可执行程序所在的一组目录

因此,如果您需要更改maven引用的java版本,则必须更改$JAVA_HOME变量。

或者看看How to change maven Java version in pom.xml

  

更新替代--config javac不会影响JAVA_HOME吗?

没有。见this

答案 2 :(得分:2)

mvn命令实际上是一个shell脚本,该脚本决定使用哪个版本的Java用于运行maven的JVM。

确定使用哪个JVM的是$JAVA_HOME和/或$JAVACMD环境变量:

  • 通常,您的环境中的$JAVA_HOME用于查找java命令。通常`$ JAVA_HOME / bin / java"使用。

  • 如果设置了$JVMCMD,则会覆盖$JAVA_HOME

  • 如果您有/etc/mavenrc个文件或~/.mavenrc,那么这些文件来自"来源"第一。因此,他们可能会覆盖您环境中的$JAVA_HOME等设置。

  • 如果明确设置了$JAVA_HOME$JAVACMD ,那么" mvn"脚本试图找到最好的"通过平台特定方式安装Java。您可能会也可能不会通过"替代品"和/或$ PATH的当前设置。

另请注意,您可以在POM文件中设置Java版本。这些会影响您构建的代码的源版本和目标版本,但它们不会影响运行构建的JVM的版本。 (因此,如果您在POM中选择Java 9并尝试在Java 8 JVM上使用Maven进行构建,那么Maven会给出错误。)

  

mvn仅依赖$JAVA_HOME,而java不依赖吗?

基本上,是的,有一些细微差别:

  • mvn针对未设置$JAVA_HOME的情况具有回退逻辑。
  • java实际上取决于您如何配置$PATH。如果您在$JAVA_HOME/bin/usr/bin之前放置$PATH(或类似),那么shell就不会看到/usr/bin/java和您的"替代品&#34 ;设置将无效。 (Java的替代机制通过将符号链接安装到/usr/bin/java/usr/bin/javac等命令来实现。)
  

update-alternatives --config javac会影响$JAVA_HOME吗?

它没有。 alternatives系统通过更新符号链接来工作。

底线:

  • 如果您想确保mvn使用特定的Java版本(不干扰其他任何内容),请在JAVA_HOME文件中导出相应的mavenrc变量。

  • 如果您想真正了解mvn的内容,请阅读脚本!