首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么‘my’显示‘`Java版本:9.0.1’,而我当前的‘`Java’命令是`1.8.0_151`?

为什么‘my’显示‘`Java版本:9.0.1’,而我当前的‘`Java’命令是`1.8.0_151`?
EN

Stack Overflow用户
提问于 2018-01-22 03:26:17
回答 3查看 1.2K关注 0票数 2

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

代码语言:javascript
复制
$ 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:

代码语言:javascript
复制
$ 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

代码语言:javascript
复制
$ which java
/usr/bin/java
$ readlink -f /usr/bin/java
/usr/lib/jvm/java-8-oracle/jre/bin/java

$PATH中唯一的一部分是

代码语言:javascript
复制
/usr/lib/jvm/java-8-oracle/bin:
/usr/lib/jvm/java-8-oracle/db/bin:
/usr/lib/jvm/java-8-oracle/jre/bin

代码语言:javascript
复制
$ echo $JAVA_HOME
/usr/lib/jvm/java-9-oracle/

一个我不太明白的解决办法:

代码语言:javascript
复制
$ 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不依赖?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-01-22 04:12:24

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

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

  • 通常,您的环境中的$JAVA_HOME用于查找java命令。通常使用$java_HOME/bin/java。
  • 如果设置了$JVMCMD,则重写$JAVA_HOME
  • 如果您有一个/etc/mavenrc文件或一个~/.mavenrc,那么这些文件首先是“源”文件。因此,它们可以从您的环境中重写$JAVA_HOME等的设置。
  • 如果$JAVA_HOME$JAVACMD而不是显式设置,那么"mvn“脚本就会通过特定于平台的方法来寻找”最佳“的安装。您可能会或不可能通过“选择”和/或$PATH的当前设置来选择版本。

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

mvn只依赖$JAVA_HOME,而java不依赖?

基本上,是的,有几个细微差别:

  • 对于没有设置mvn的情况,$JAVA_HOME有回退逻辑。
  • java实际上取决于您如何配置$PATH。如果将$JAVA_HOME/bin (或类似的)放在$PATH中的/usr/bin前面,那么shell将不会看到/usr/bin/java,而“替代”设置将是无效的。( Java的替代机制可以通过安装/usr/bin/java/usr/bin/javac等命令的符号链接来工作。)

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

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

底线:

  • 如果要确保mvn使用特定的JAVA_HOME版本(而不干扰任何其他版本),请在mavenrc文件中导出适当的mavenrc变量。
  • 如果您想真正了解mvn是怎么回事,请阅读脚本!
票数 3
EN

Stack Overflow用户

发布于 2018-01-22 03:37:02

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

简单地说,是因为您安装了两个不同版本的Java。当您从命令行输入java时,它使用一个版本。mvn找到了另一个版本。

您可以通过键入以下命令查看使用了哪个java可执行文件

代码语言:javascript
复制
which java

mvn的输出显示它使用的是安装在/usr/lib/jvm/java-9-oracle上的JDK。

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

代码语言:javascript
复制
echo $PATH 

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

票数 2
EN

Stack Overflow用户

发布于 2018-01-22 03:57:49

mvn只依赖JAVA_HOME,而java不依赖?

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

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

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

或者看看如何在pom.xml中更改maven Java版本

更新选项--配置javac不影响JAVA_HOME吗?

不是的。请参阅

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48374306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档