JAVA_HOME环境变量和"java -version"的输出有什么区别

Sam*_*nga 2 java environment-variables java-home

实际上JAVA_HOME环境变量是什么?我有点怀疑.通过设置它做了什么?我还有另一个问题,如果我们在操作系统中有两个或更多JDK,我们可以设置一个版本的路径来设置$ JAVA_HOME变量,另一个版本作为运行java的机器中的"java -version"显示我认为在ubuntu中,java --version命令给出了JRE配置(运行java)版本的java和JAVA_HOME变量定义了用于编译java程序的版本.我对么?实际上这两个输出引用的jdks之间的区别是什么 -

    1. echo $JAVA_HOME 
    2. java -version
Run Code Online (Sandbox Code Playgroud)

Ste*_*n C 6

让我们从两个命令的作用开始.

  echo $JAVA_HOME 
Run Code Online (Sandbox Code Playgroud)

这将输出JAVA_HOME环境变量的值.按照惯例,此环境变量(通常在shell"rc"文件中)设置为JRE或JDK安装的基本目录.但是,Oracle或OpenJDK核心Java工具都不依赖于此.您设置JAVA_HOME了第三方工具的好处,告诉他们系统中可能有多少JRE或JDK安装使用.

所以运行echo $JAVA_HOME通常给目录一个 JRE或JDK.但它可能没有设置......或指向缺少目录.

  java -version
Run Code Online (Sandbox Code Playgroud)

这将运行该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
Run Code Online (Sandbox Code Playgroud)

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

(替代系统是一种为命令或命令集实现可切换的系统范围默认值的方法.阅读手册条目以获取更多详细信息.但请注意,Linux的Oracle Java安装程序(或RPM)不会"理解" Linux替代系统......我的一个bugbears!)

最后,在shell"rc"文件中看到类似的东西是很常见的:

  export JAVA_HOME=/path/to/jre              # (or jdk)
  export PATH=/bin:$JAVA_HOME/bin:/usr/bin:...
Run Code Online (Sandbox Code Playgroud)

这没有什么神奇之处.该$JAVA_HOME会由外壳扩展它设置环境变量之前.实际PATH价值将是:

  /bin:/path/to/jre/bin:/usr/bin:...
Run Code Online (Sandbox Code Playgroud)

总结如下:

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

  • java -version告诉你java命令来自的JRE或JDK .

  • 它们可能不同.