JAVA_HOME环境变量和“ java -version”的输出之间有什么区别

What is the difference between the JAVA_HOME environment variable and the output of “java -version”

JAVA_HOME环境变量实际上是什么? 我很怀疑 设置该怎么办? 我还有另一个问题,如果操作系统中有两个或多个JDK,我们可以设置一个版本的路径来设置$ JAVA_HOME变量,而另一个版本设置为机器中正在运行的Java,如" java -version"所示。 正如我在ubuntu中所认为的那样,java --version命令提供了JRE配置(正在运行Java)的Java版本,而JAVA_HOME变量定义了用于编译Java程序的版本。 我对么? 这两个输出所引用的jdk之间实际上有什么区别-

1
2
    1. echo $JAVA_HOME
    2. java -version

让我们从这两个命令开始。

1
  echo $JAVA_HOME

这将输出JAVA_HOME环境变量的值。按照惯例,此环境变量(通常在外壳" rc"文件中)设置为JRE或JDK安装的基本目录。但是,Oracle或OpenJDK核心Java工具都不依赖于此。您可以设置JAVA_HOME来使用第三方工具,以告诉他们要使用系统中许多JRE或JDK安装中的哪个。

因此,运行echo $JAVA_HOME通常会提供JRE或JDK的目录。但是它可能未设置...或指向缺少的目录。

1
  java -version

这将运行java命令,并告诉其输出自己的版本信息。与前一个不同,如果您的shell可以找到一个(真实的)java命令,则它输出的信息是确定的。

但是java命令将来自哪个JRE / JDK?

好吧,这取决于外壳以及外壳(通常)如何查找命令。对于所有主流Unix / Linux / BSD外壳程序,这都由PATH环境变量控制。 PATH变量定义命令搜索路径;即外壳程序在其中查找命令的目录列表。

因此,如果PATH/usr/bin:/bin:/usr/local/bin:/home/joeuser/bin:/usr/java/jre-x.y.z/bin,则外壳程序将依次在每个目录中查找java。它找到的第一个java命令将是执行的命令。您可以通过运行此命令找出是哪一个。

1
  which java

但这还没有结束,因为如果您在典型的Linux系统上使用OpenJDK Java安装,则/usr/bin中的java命令实际上是由alternatives管理的符号链接链中的第一个。命令。实际的可执行文件在链的另一端。

(替代系统是为一个命令或一组命令实现可切换的系统范围缺省值的方法。有关更多详细信息,请阅读手册条目。但是请注意,用于Linux的Oracle Java安装程序(或RPM)不会"增加" Linux替代系统...我的负担之一!)

最后,通常会在shell" rc"文件中看到类似以下内容的东西:

1
2
  export JAVA_HOME=/path/to/jre              # (or jdk)
  export PATH=/bin:$JAVA_HOME/bin:/usr/bin:...

这没有什么神奇的。 $JAVA_HOME将在设置环境变量之前由外壳程序进行扩展。实际的PATH值将是:

1
  /bin:/path/to/jre/bin:/usr/bin:...

因此,总而言之:

  • echo $JAVA_HOME告诉您JRE或JDK默认情况下将尝试使用典型的第三方工具。

  • java -version告诉您java命令来自的JRE或JDK。

  • 它们可能不同。


JAVA_HOME是一个环境变量,包含安装Java的目录(如果安装了Java的几个版本-这将指向默认值)

java -version是显示安装了哪个版本的Java的命令(同样,如果安装了几个版本,则默认使用该命令)。

另外:感谢Luiggi的评论:如果安装java的文件夹不在PATH(另一个环境变量)中-运行java -version或任何其他java命令将失败!


1
echo $JAVA_HOME

将打印称为JAVA_HOME的环境变量的值。如果未设置,它将打印一条空消息。通常,将JAVA_HOME设置为PC中安装的最新JDK的路径。

1
java -version

如果配置,将打印在路径中设置的Java可执行文件(Java虚拟机)的版本。否则,它将在命令行上引发异常。


它与jdk和JRE不相关。 java -version由/ usr / bin / java中的java使用。在某些应用程序中使用$ JDK_HOME。两个jdk是相同的。或者我们可以定义不同的jdk。