我想知道为什么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
不依赖吗?
答案 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
的内容,请阅读脚本!