JAVA_HOME环境变量和“ java -version”的输出之间有什么区别
2020-09-19
environment-variablesjavajava-home
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 | 1. echo $JAVA_HOME |
让我们从这两个命令开始。
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 | export JAVA_HOME=/path/to/jre # (or jdk) |
这没有什么神奇的。 $JAVA_HOME将在设置环境变量之前由外壳程序进行扩展。实际的PATH值将是:
1 | /bin:/path/to/jre/bin:/usr/bin:... |
因此,总而言之:
-
echo $JAVA_HOME告诉您JRE或JDK默认情况下将尝试使用典型的第三方工具。
-
java -version告诉您java命令来自的JRE或JDK。
-
它们可能不同。
- 因此,如果上面的2引用2个Java版本,(这发生在我的ubuntu操作系统中),操作系统中的两个应用程序是否可能会使用不同的Java版本?
- export JAVA_HOME = / path / to / jre#(或jdk)export PATH = / bin:$ JAVA_HOME / bin:/ usr / bin:... 如果在shell rc文件中设置了其中两个命令,没有回声$ JAVA_HOME和java -version引用两个Java版本的可能性。我对么???
- 如果您的外壳已经获取了rc文件,那么您是正确的。但这都是" Linux shell 101"的东西。也许您需要查找并阅读有关使用Linux Shell的优秀教程/书...
- 如果上面的2(echo $ JAVA_HOME和java -version)引用了2个Java版本,(这发生在我的ubuntu操作系统中),操作系统中的两个应用程序是否可能会使用不同的Java版本?您对此有何想法?
- 是的,那是可能的。是否真的以这种方式发生取决于应用程序,以及它们(或它们各自的包装脚本)如何确定使用哪个JRE安装。
- 非常有用的答案,特别是有关外壳如何在PATH中搜索第一个Java的信息,可以是$ JAVA_HOME / bin(如果它在PATH中),也可以是他之前找到的另一个Java。现在,我理解了为什么我们通常会在$ PATH的开头而不是结尾处看到$ JAVA_HOME / bin的原因。
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。而且您可能会犯错误以为其赋予错误的价值。
- 您在Windows中手动配置@LuiggiMendoza吗?原因是Mac随附安装。
- 在Windows中,配置所有它们。手动。是的,它可能会严重失败。
- " JAVA_HOME是一个环境变量,其中包含安装Java的目录"-仅是一种约定。 Oracle Java工具(至少)不依赖$ JAVA_HOME。
- @StephenC谢谢!我猜想这解释了为什么Windows上安装Java时默认未设置此env变量的原因?
- 那么此设置java_home变量的用途是什么?
- @SamithaChathuranga有一些应用程序依赖于此变量来执行各种操作(甚至只是为了起作用)。这是一个例子
- 您的意思是有时某些应用程序使用JAVA_HOME变量在操作系统中找到了java.exe(用于运行Java程序)和javac.exe(用于编译Java文件)吗?如果JAVA_HOME引用一个Java版本,而Java -vesion显示另一个Java版本怎么办?
- @SamithaChathuranga,如果应用程序使用JAVA_HOME,则多数民众赞成在使用Java的版本,而不管命令提示符中java -version的输出如何。根据以上Stephen和Luiggi的评论,该操作系统可能会或可能不会使用JAVA_HOME(它只是一个约定)。
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。
- 您的意思是有时某些应用程序使用JAVA_HOME变量在操作系统中找到了java.exe(用于运行Java程序)和javac.exe(用于编译Java文件)吗?如果JAVA_HOME引用一个Java版本,而Java -vesion显示另一个Java版本怎么办?那会发生什么呢?