让我们从这两个命令的作用开始。
echo $JAVA_HOME
这会输出JAVA_HOME 环境变量的值。按照惯例,此环境变量设置(通常在 shell“rc”文件中)到 JRE 或 JDK 安装的基目录。但是,Oracle 或 OpenJDK 核心 java 工具都不依赖于此。您设置 JAVA_HOME 是为了让 3rd-party 工具受益,告诉他们使用系统上可能的多个 JRE 或 JDK 安装中的哪一个。
所以运行echo $JAVA_HOME 将通常提供a JRE 或JDK 的目录。但它可能未设置...或指向丢失的目录。
java -version
这会运行java 命令并告诉它输出它自己的 版本信息。与前面不同的是,如果你的 shell 可以找到(真正的)java 命令,那么它输出的信息就是确定的。
但是java命令会来自哪个JRE/JDK呢?
这取决于 shell,以及它(通常)如何找到命令。对于所有主流的 Unix / Linux / BSD shell,这是由 PATH 环境变量控制的。 PATH 变量定义了一个命令搜索路径;即 shell 查找命令的目录列表。
因此,如果 PATH 是 /usr/bin:/bin:/usr/local/bin:/home/joeuser/bin:/usr/java/jre-x.y.z/bin,那么 shell 将依次在每个目录中查找 java。它找到的第一个java 命令将是执行的命令。你可以通过运行这个命令找出它是哪一个。
which java
但这还没有结束,因为如果您在典型的 Linux 系统上使用 OpenJDK Java 安装,/usr/bin 中的 java 命令实际上是由alternatives 命令。实际的可执行文件位于链的另一端。
(替代系统是一种为命令或命令集实现可切换系统范围默认值的方法。请阅读手册条目了解更多详细信息。但请注意,Oracle Java 安装程序(或 RPM ) 对于 Linux,不要“摸索” Linux 替代系统……我的问题之一!)
最后,在 shell“rc”文件中经常会看到这样的内容:
export JAVA_HOME=/path/to/jre # (or jdk)
export PATH=/bin:$JAVA_HOME/bin:/usr/bin:...
这并没有什么神奇之处。 $JAVA_HOME 将在设置环境变量之前由 shell 扩展。实际的PATH 值为:
/bin:/path/to/jre/bin:/usr/bin:...
总之: