gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 06:50:57 27 4
gpt4 key购买 nike

我想知道为什么 mvn 显示 Java 版本: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 不依赖?

最佳答案

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$JAVCMD 明确设置,则“mvn”脚本会尝试找到“最佳"通过特定于平台的方式安装 Java。您最终可能会或可能不会通过“替代方案”和/或 $PATH 的当前设置选择版本。

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

Does mvn rely only on $JAVA_HOME, while java doesn't?

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

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

Does update-alternatives --config javac affect $JAVA_HOME?

事实并非如此。 alternatives 系统通过更新符号链接(symbolic link)来工作。


底线:

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

  • 如果你想真正了解 mvn 发生了什么,请阅读脚本!

关于java - 为什么 `mvn` 显示 `Java version: 9.0.1` ,而我当前的 `java` 命令是 `1.8.0_151` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48374306/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com