【问题标题】:What is the difference between the JAVA_HOME environment variable and the output of "java -version"JAVA_HOME 环境变量和“java -version”的输出有什么区别
【发布时间】:2014-08-19 05:02:40
【问题描述】:

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

    1. echo $JAVA_HOME 
    2. java -version

【问题讨论】:

    标签: java environment-variables java-home


    【解决方案1】:

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

      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:...
    

    总之:

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

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

    • 它们可能不同。

    【讨论】:

    • 那么如果上面的2指的是2个java版本,(这发生在我的ubuntu os中)是不是os中的两个应用程序会使用不同的java版本?
    • export JAVA_HOME=/path/to/jre # (or jdk) export PATH=/bin:$JAVA_HOME/bin:/usr/bin:... ////如果这些命令中有2个在 shell rc 文件中设置,没有可能 echo $JAVA_HOME 和 java -version 引用两个 java 版本。我说的对吗?
    • 如果你的 shell 已经获取了 rc 文件,那么你是正确的。但这都是“Linux shell 101”的东西。也许你需要找到并阅读一本关于使用 Linux shell 的好教程/书......
    • 如果上面的2(echo $JAVA_HOME and java -version)指的是2个java版本,(这发生在我的ubuntu os中)是不是os中的两个应用程序会使用不同的java版本?您对此有何想法?
    • 是的,这是可能的。它是否真的以这种方式发生取决于应用程序,以及它们(或它们各自的包装脚本)如何确定要使用的 JRE 安装。
    【解决方案2】:

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

    java -version 是一个显示安装了哪个版本的 Java 的命令(同样,在安装了几个版本的情况下默认使用的那个)

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

    【讨论】:

    • 请注意,如果您未在PATH 环境变量中设置java.exe 的位置,java -version 在 Windows 中将失败。
    • @LuiggiMendoza 正确。如果java 不在PATH 中,任何java 命令都会失败!
    • 另外,您应该手动配置 JAVA_HOME。你可能会犯错误,为其设置错误的值。
    • “JAVA_HOME 是一个环境变量,包含安装 Java 的目录” - 这只是一个约定。 Oracle Java 工具(至少)不依赖于 $JAVA_HOME。
    • @SamithaChathuranga 有一些应用程序依赖这个变量来做各种各样的事情(甚至只是为了发挥作用)。这里是one example
    【解决方案3】:

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

    【讨论】:

    • 你的意思是java.exe(运行java程序)和javac.exe(编译java文件)是由操作系统使用该JAVA_HOME变量有时被某些应用程序找到的吗?如果 JAVA_HOME 指的是一个 java 版本而 java -vesion 显示另一个 java 版本怎么办?那会发生什么?
    【解决方案4】:
    echo $JAVA_HOME
    

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

    java -version
    

    将打印路径中设置的 java 可执行文件(Java 虚拟机)的版本(如果已配置)。否则会在命令行抛出异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 2017-01-19
      • 2011-02-21
      • 1970-01-01
      • 2015-01-10
      • 1970-01-01
      相关资源
      最近更新 更多