5154

Good Luck To You!

CentOS系统安装了多个JDK版本,如何切换设置默认的?

在开发和运维工作中,一台服务器上可能同时存在多个版本的Java开发工具包(JDK),某些遗留项目依赖于Java 8,而新项目则可能需要Java 11或更高版本,在这种多版本共存的环境下,如何为系统指定一个默认的JDK版本,确保全局命令(如java, javac)能够调用到正确的版本,就成为一个至关重要的问题,本文将详细介绍在CentOS系统中如何优雅地设置和管理默认的JDK,核心工具是alternatives,这是一个在红帽系Linux发行版中用于管理同名软件多版本的强大工具。

CentOS系统安装了多个JDK版本,如何切换设置默认的?


准备工作

在开始之前,请确保您已经具备以下条件:

  1. 一台运行CentOS 7或更高版本的计算机。
  2. 拥有sudoroot权限,因为修改系统级别的默认软件需要管理员权限。
  3. 系统中已经安装了至少一个JDK版本,如果尚未安装,可以通过yumdnf轻松安装OpenJDK,或手动下载安装Oracle JDK。

第一步:检查当前已安装的JDK

我们需要了解系统当前的状态,查看已经安装了哪些JDK版本,打开终端,执行以下命令:

java -version

这个命令会显示当前由PATH环境变量决定的java命令所指向的JDK版本。

要获取系统中所有已安装的Java相关软件包,可以使用:

rpm -qa | grep -E 'jdk|java'

执行后,您可能会看到类似以下的输出,列出了所有已安装的OpenJDK或Oracle JDK软件包及其版本号,这将帮助您确定接下来需要在alternatives中管理的Java路径。

java-1.8.0-openjdk-1.8.0.322.b06-1.el7_9.x86_64
java-1.8.0-openjdk-headless-1.8.0.322.b06-1.el7_9.x86_64
java-11-openjdk-11.0.14.1.1-1.el7_9.x86_64
java-11-openjdk-headless-11.0.14.1.1-1.el7_9.x86_64

第二步:使用 alternatives 命令管理JDK

alternatives是CentOS设置默认JDK的核心方法,它通过创建和管理一组符号链接,将一个通用名称(如/usr/bin/java)指向特定版本的实际可执行文件,从而实现版本的动态切换。

1 将JDK安装到 alternatives 系统

假设您已经安装了OpenJDK 8和OpenJDK 11,您需要将它们分别注册到alternatives系统中,这里的“安装”并非指软件安装,而是指告诉alternatives工具有这些版本的存在。

以OpenJDK 8为例,首先找到其java可执行文件的路径,它位于/usr/lib/jvm/目录下,您可以使用findls命令定位。

ls /usr/lib/jvm/java-1.8.0-openjdk-*/jre/bin/java
# 输出示例: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el7_9.x86_64/jre/bin/java

使用alternatives --install命令进行注册:

sudo alternatives --install /usr/bin/java java /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el7_9.x86_64/jre/bin/java 1

我们来分解这个命令:

CentOS系统安装了多个JDK版本,如何切换设置默认的?

  • --install: 告诉alternatives我们要添加一个新的软件链接。
  • /usr/bin/java: 通用链接的路径,我们平时执行java命令时系统寻找的就是它。
  • java: 这个链接组的名称,用于内部管理。
  • /usr/lib/jvm/.../bin/java: 这是我们刚刚找到的Java 8的实际可执行文件路径。
  • 1: 优先级,这是一个整数,数字越大,优先级越高,当我们自动选择默认版本时,优先级最高的版本会被选中。

为OpenJDK 11执行同样的操作,并给予它更高的优先级(例如2):

sudo alternatives --install /usr/bin/java java /usr/lib/jvm/java-11-openjdk-11.0.14.1.1-1.el7_9.x86_64/bin/java 2

2 配置默认JDK

注册完成后,您就可以选择默认版本了,使用alternatives --config命令:

sudo alternatives --config java

系统会列出一个交互式菜单,显示所有已注册的Java版本及其优先级,当前默认版本前会有一个号:

共有 2 个程序提供“java”。
  选择    命令
-----------------------------------------------
*+ 1           /usr/lib/jvm/java-11-openjdk-11.0.14.1.1-1.el7_9.x86_64/bin/java
   2           /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el7_9.x86_64/jre/bin/java
按 Enter 来保存当前选择[+],或键入选择的编号:

输入您希望设为默认的版本对应的编号(输入2选择Java 8),然后按回车键即可。

3 管理其他Java工具

仅仅设置java命令是不够的,开发人员还需要javac(编译器)、jar(打包工具)等,您需要为这些工具分别配置alternatives

javac为例:

# 注册 Java 8 的 javac
sudo alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el7_9.x86_64/bin/javac 1
# 注册 Java 11 的 javac
sudo alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-11-openjdk-11.0.14.1.1-1.el7_9.x86_64/bin/javac 2
# 配置默认的 javac
sudo alternatives --config javac

重复此过程,为jar, javadoc等其他关键工具进行配置,确保整个JDK工具链的版本保持一致。

第三步:验证设置

完成配置后,务必进行验证,再次执行java -versionjavac -version,检查输出是否为您刚刚选择的版本。

java -version
# 输出示例 (如果选择了Java 8):
# openjdk version "1.8.0_322"
# OpenJDK Runtime Environment (...)
# OpenJDK 64-Bit Server VM (...)
javac -version
# 输出示例:
# javac 1.8.0_322

您还可以使用alternatives --display java查看当前java链接组的详细信息,包括当前链接、所有候选版本及其路径和优先级。

替代方案:手动配置环境变量

虽然alternatives是推荐的系统级方法,但在某些特定场景下(如为特定用户配置或在容器环境中),手动设置JAVA_HOMEPATH环境变量也是一种选择。

CentOS系统安装了多个JDK版本,如何切换设置默认的?

这通常通过编辑用户目录下的.bashrc.bash_profile文件,或系统级别的/etc/profile文件来实现。

/etc/profile.d/目录下创建一个新的脚本文件java_env.sh

sudo vi /etc/profile.d/java_env.sh

在文件中添加以下内容(以Java 8为例):

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el7_9.x86_64
export PATH=$JAVA_HOME/bin:$PATH

保存文件后,运行source /etc/profile.d/java_env.sh或重新登录,使配置生效。

注意:这种方法是静态的,切换版本需要手动修改文件并重新加载,它不如alternatives灵活,特别是当需要频繁切换版本时,对于centos设置默认jdk这一需求,alternatives无疑是更优雅、更高效的解决方案。


相关问答FAQs

在CentOS上管理多个JDK版本,有什么最佳实践吗?

解答: 是的,有几个重要的最佳实践,强烈推荐使用alternatives作为系统级版本管理的首选工具,它提供了官方支持且操作安全,不要轻易卸载旧版本的JDK,除非您确定所有依赖它的应用都已迁移,因为这可能导致依赖关系破裂,对于开发者,可以考虑使用像SDKMAN!(Software Development Kit Manager)这样的版本管理工具,它允许在用户级别轻松安装和切换多种JDK、Maven、Gradle等工具,与系统级的alternatives互不干扰,为每个项目明确记录其所需的JDK版本,并在项目文档或构建脚本(如pom.xml, build.gradle)中指定,确保环境的一致性。

alternatives和直接修改JAVA_HOME有什么根本区别?

解答: 它们的根本区别在于作用范围、实现机制和动态性。alternatives是系统级的工具,它通过管理/usr/bin/下的符号链接来影响所有用户和会话,切换是即时生效的,无需重新加载环境变量,而JAVA_HOME是一个环境变量,其作用范围取决于它被定义的位置:定义在/etc/profile中影响所有用户,定义在~/.bashrc中则只影响当前用户,修改JAVA_HOME后,必须通过source命令或重新登录才能使其在当前会话中生效。alternatives管理的是“命令”的默认指向,而JAVA_HOME是提供一个“路径”供脚本和程序引用,对于设置系统默认的java命令,alternatives更直接、更规范。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2025年11月    »
12
3456789
10111213141516
17181920212223
24252627282930
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
    文章归档
    网站收藏
    友情链接

    Powered By Z-BlogPHP 1.7.3

    Copyright Your WebSite.Some Rights Reserved.