如何在运行多个版本时找到您的 Java Home

通过学习如何引导应用程序使用正确的版本,充分利用 Java 的灵活性。
1 位读者喜欢这篇文章。
Coffee beans

Pixabay. CC0.

当您安装 Java 时,告知您的系统在需要时在哪里找到正确的语言是安装程序的工作之一。 这就是为什么您能够运行 Java 应用程序的原因 - 事实上,您有时可能运行 Java 应用程序,甚至没有意识到它们是用什么语言编写的。

简而言之,它只是有效,就像您安装 Python 来运行 Python 应用程序,安装 C 来运行 C 语言编写的应用程序等等。

但是,如果在您的系统上安装了多个 Java 版本会发生什么情况? 在这种情况下,您必须承担额外的责任,了解每个版本的 JAVA_HOME 所在的位置。

解决此问题的最简单方法是使用 SDKMan。 但是,如果您没有 SDKMan,则需要手动完成。

为什么您可能需要多个 Java 版本

您可能需要在计算机上安装多个 Java 版本的原因有几个。

  • 编程语言的进展速度是一种,而应用程序的开发速度可能不同。 Java(该语言)的版本号可能会递增,而您喜欢的应用程序仍使用旧版本。 如果您有两个必备的应用程序,每个应用程序都使用不同版本的 Java,您可能需要同时安装这两个版本。

  • 开发人员从事许多不同的项目,其中一些项目可能使用旧的长期支持 (LTS) 版本的 Java,而另一些项目则使用最新版本。

  • 您可能使用的系统没有在系统范围内安装 Java 的权限。 您可以改为从您的主目录运行 Java,但这有时意味着您必须将应用程序指向该非标准安装位置。

JAVA_HOME 变量

安装多个 Java 版本是完全可以接受的,但应用程序可能不知道在哪里找到它需要的版本。

通常,应用程序只使用您设置为默认 Java 运行时的任何内容。 这可能是您自己没有设置的东西。 根据您运行的 Linux 发行版以及您用于安装 Java 的方法,您的系统默认值可能是您安装的第一个 Java 版本,也可能是最新的版本。

无论您的默认设置是什么,如果您尝试启动应用程序,然后收到有关您使用的 Java 版本的错误,即使您知道您已在系统上的某个位置安装了正确的版本,您也可以手动覆盖该设置。

应用程序可以从您当前会话的 环境变量 中派生出 Java 的位置。

首先,看看 JAVA_HOME 当前设置为多少

$ echo $JAVA_HOME

如果有输出,则您的计算机正在维护一个 JAVA_HOME 变量。 如果没有输出,则您的计算机没有设置该变量。 这并不一定意味着您的计算机没有 Java home,只是意味着没有任何东西设置过它。

找到正确的版本

在您可以设置 JAVA_HOME 之前,您需要知道您想使用哪个 Java 版本。 您需要使用哪个 Java 版本取决于您尝试运行的应用程序。 如果一个应用程序需要 Java 8 才能运行,您需要将其指向包含 Java 8 的 bin 目录。 如果一个应用程序需要 Java 17 才能运行,您需要将其指向包含 Java 17 的 bin 目录。

您可以使用 -version 选项找到您当前的默认 Java 版本。 启动终端并键入此命令(省略 $ 命令提示符)

$ java -version

从包管理器中找到正确的位置

现在您需要知道您想要使用的 Java 版本在哪里。

如果您通过包管理器安装了 Java,您可以查询您的包管理器以获取文件列表。 这会告诉您使用该包安装了什么文件以及安装在什么位置。

例如,在 Fedora、CentOS 或 Mageia 上,您可以列出所有已安装的包,并使用 grep 仅查看包含字符串 java 的包

$ dnf list installed | grep java

为了获得更清晰的输出,请使用 awk

$ dnf list installed | awk --field-separator=' ' '/java/{print $1;}'
java-1.8.0-openjdk.x86_64
java-1.8.0-openjdk-devel.x86_64
java-1.8.0-openjdk-headless.x86_64
java-11-openjdk.x86_64
java-11-openjdk-devel.x86_64
java-11-openjdk-headless.x86_64
java-11-openjdk-src.x86_64
javapackages-filesystem.noarch
javapackages-tools.noarch
tzdata-java.noarch

假设您需要有关 Java 8(版本 1.8)的信息。
您可以使用 rpm 命令查看 Java 8 包中的每个文件

$ rpm --query --all --list \
java-1.8.0-openjdk* | grep bin/java$
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-2.el8_5.x86_64/jre/bin/java
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-2.el8_5.x86_64/bin/java

您可能会得到多个结果,但请仔细查看文件路径。 通常,您只需要其 Java 发行版的主要 bin 目录中的 Java 可执行文件。

在此示例中,Java 8 的路径是

 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-2.el8_5.x86_64/bin

如果您使用不同的包管理器,则命令会有所不同,但目标仍然相同。 有关详细信息,请查阅您的包管理器的文档。

从手动安装中找到正确的位置

如果您已从 .tar 存档(“tarball”)手动安装了 Java,则您的包管理器没有记录。 希望您知道您将其放在哪里,因此找到其 JAVA_HOME 的路径就像列出其 bin 目录的绝对路径一样简单。

以下是我如何确认我应该存在的目录确实存在

$ file /opt/jdk-1.8.0/bin

临时设置 JAVA_HOME

现在您知道了您想要的 JAVA_HOME 的位置。

要临时设置一个 JAVA_HOME 变量,您可以在您想要运行的命令之前加上您的变量设置。 例如,假设您使用的系统上同时安装了 Java 8 和 Java 11。 Java 8 最初已安装,但您下载了 Java 11,因为您想要尝试的一个很酷的新应用程序需要它。

放置在您正在运行的命令之前的环境变量会被该命令继承

$ JAVA_HOME=/opt/jdk-1.8.0/bin coolNewApp

使用 alternatives 命令永久设置 JAVA_HOME

要永久设置一个新的默认 Java 版本,请使用 alternatives 命令。 alternatives 命令会查看安装在您的 Linux 系统上的应用程序,并让您选择要使用的版本。 某些发行版(例如 Slackware)不提供 alternatives 命令,因此您必须改为使用本地安装方法。

在 Fedora、CentOS、Mageia 和类似的发行版上,该命令是 alternatives

在 Debian 和 Ubuntu 以及类似的发行版上,该命令是 update-alternatives

要获取当前安装在您的 Fedora 系统上的应用程序的可用版本列表

$ alternatives --list

在 Debian 上,您必须指定您想要 alternatives 的应用程序

$ update-alternatives --list java

要选择您想要在 Fedora 和类似系统上设置为系统默认值的版本

$ sudo alternatives --config java

在基于 Debian 的系统上

$ sudo updates-alternatives --config java

您可以根据要运行的应用程序的需要更改默认的 Java 版本。

选择您的 Java

通常,您不必担心应用程序在使用 Java 时会感到困惑,但 Java 的一个好处是它允许您同时安装不同的版本。 感谢该功能,您可以运行甚至尚未更新到最新版本的 Java 的旧软件,同时仍然运行最新的 Java 应用程序。

然而,这种灵活性也带来了理解如何引导应用程序使用正确版本的责任。 现在您知道该怎么做了。

如果此方法看起来工作量很大,请考虑改用 SDKMan。

接下来读什么
标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。 他曾在电影和计算机行业工作,通常同时进行。

评论已关闭。

知识共享许可协议本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.