为什么我可以在不设置 JAVA_HOME 的情况下使用 javac & java?

Why can I use javac & java without having JAVA_HOME set?

我的 Java 版本是:

java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)

我没有在 ~/.bash_profile 中设置 JAVA_HOME,但我可以同时使用 javacjava

我的 .bash_profile 看起来像这样:

export EDITOR="vim"
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion

export MAVEN_HOME="$HOME/opt/maven"
export PATH="$PATH:$MAVEN_HOME/bin"

如果我想安装 JDK 的其他版本,例如 11、14、15...,我该如何使用它?我需要设置JAVA_HOME吗?

如果我同时安装了多个版本的JDK,我该如何根据需要在不同的时间使用它们?我在网上看到的是配置Java_home,完全不知道怎么弄,因为我担心我安装了其他几个版本的JDK后,他们不会'没用。

我使用 MacOS Big Sur。

JAVA_HOME 被广泛误解。

Java 本身(即 javajavac 和相关的可执行文件)实际上并不关心 JAVA_HOME.

当它们被执行时,它们知道要使用哪个 JDK(与它们关联的那个)。唯一相关的是您的 shell(或其他工具) 首先找到 可执行文件,为此 PATH is used。请注意,PATH 是一个通用变量,如今基本上所有广泛使用的通用 OS 都使用它来查找可执行文件。 不是 Java 特定的东西。

换句话说:当直接从 shell 启动 java 时,只有 PATH 是相关的。

那么为什么 JAVA_HOME 出现得如此频繁?

一些 第三方工具(例如Gradle、Maven、Tomcat 和其他各种工具)将使用JAVA_HOME 来查找适当JDK/JRE执行。如果没有设置 JAVA_HOME,大多数会返回到 PATH 上的任何内容。

所以如果你使用这样的工具并且你想指定一个特定的Java版本那么你可以设置JAVA_HOME 作为附加提示。

JAVA_HOME 设置为指向您首选的 Java 运行时可能是个好主意,但在很多情况下 不需要

一种常用的模式是定义一个 JAVA_HOME 以指向您的首选 JDK,然后使用它来设置您的 PATH。这样两者就会对齐,如果preferred JDK改变了,只需要改变一点:

export JAVA_HOME="/some/path/pointing/to/a/jdk"
export PATH="$JAVA_HOME/bin:$PATH"

您可以使用 Jenv 维护不同版本的 JDK 并动态设置 JAVA_HOME

您还可以为不同的文件夹设置特定的 Java 版本,方法是使用名为 .java-version 的文件并提及 java 版本。

我对 sdkman 有很好的体验。您可以轻松安装不同的 JDK 并在它们之间切换。所有必需的环境变量将由 sdkman 设置!