三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

CentOS 7 安装配置JDK全攻略:OpenJDK选型、YUM与手动安装详解

CentOS 7 安装配置JDK全攻略:OpenJDK选型、YUM与手动安装详解

1. 项目概述:为什么在CentOS 7上安装JDK依然是关键一步?

如果你刚拿到一台崭新的CentOS 7服务器,或者接手了一个老旧的、需要Java环境支持的项目,那么配置JDK(Java Development Kit)几乎是你绕不开的第一步。尽管现在Java 17、21等新版本已经提供了更现代化的安装方式,但CentOS 7作为一款长期稳定、在企业内部广泛部署的Linux发行版,其上Java环境的部署依然是一个高频且必须掌握的运维技能。这不仅仅是运行一个yum install java那么简单,从选择哪个JDK版本(Oracle JDK vs OpenJDK)、采用哪种安装方式(YUM仓库、RPM包还是手动解压),到后续的环境变量配置、多版本管理以及安全加固,每一步都藏着细节和“坑”。

我见过不少新手在配置完JAVA_HOME后,java -version命令依然报错,或者Tomcat启动时找不到正确的Java路径。也遇到过生产环境因为使用了不受支持的Java版本而导致的兼容性问题。因此,这篇内容的目的,就是带你从头到尾、事无巨细地走一遍在CentOS 7上安装和配置JDK的全过程。我会基于最常见的生产实践,不仅告诉你“怎么做”,更会解释“为什么这么做”,并分享那些只有踩过坑才知道的注意事项。无论你是运维工程师、后端开发者,还是正在学习Linux的学生,这篇指南都能让你获得一个稳定、可控且易于管理的Java运行环境。

2. 核心思路与方案选型:OpenJDK还是Oracle JDK?

在动手之前,我们必须先做一个关键决策:选择哪个JDK发行版。这直接关系到后续的安装方式、许可协议和长期维护成本。

2.1 OpenJDK:开源社区的首选

OpenJDK是Java SE平台的开源参考实现。自从Oracle调整了JDK的发布策略后,OpenJDK已经成为绝大多数场景下的默认和推荐选择。对于CentOS 7而言,选择OpenJDK有以下几个压倒性优势:

  1. 官方仓库集成:CentOS 7自带的YUM/DNF仓库中,就包含了OpenJDK的各个版本。这意味着你可以通过系统包管理器一键安装、更新和卸载,依赖关系自动处理,最为省心。
  2. 零成本:完全免费,无论是用于开发、测试还是生产环境,都无需担心许可费用问题。
  3. 长期支持:由Red Hat(CentOS的赞助商)等厂商提供长期支持(LTS)版本的维护和安全性更新,对于追求稳定的企业环境至关重要。例如,OpenJDK 8和OpenJDK 11都有很长的支持周期。
  4. 与系统兼容性最佳:作为系统包管理器分发的软件,它与系统其他组件的兼容性经过充分测试。

结论:对于绝大多数生产环境、个人学习以及一般性开发,我强烈推荐使用OpenJDK。它的易用性、稳定性和零成本特性,使其成为CentOS 7上的不二之选。我们后续的演示也将以OpenJDK 8(一个极其经典的LTS版本)和OpenJDK 11(目前另一个主流的LTS版本)为例。

2.2 Oracle JDK:特定场景的考量

Oracle JDK曾经是标准答案,但现在其定位发生了变化。它基于OpenJDK构建,但包含了一些Oracle专属的商业特性、工具(如Java Flight Recorder)和更严格的许可协议。在CentOS 7上考虑它,通常仅限于以下情况:

  • 明确依赖Oracle专属特性:你的应用必须使用到只有Oracle JDK才提供的工具或功能。
  • 历史遗留系统要求:一些非常老旧的、定制化的商业软件可能指定必须使用Oracle JDK。
  • 愿意接受许可协议:你需要仔细阅读并接受Oracle Technology Network License Agreement,特别是对于生产环境的使用,许可条款可能涉及费用。

安装方式:通常需要手动从Oracle官网下载RPM或.tar.gz压缩包进行安装,无法通过系统仓库直接安装,后续更新和维护也更麻烦。

注意:除非你有非常确凿的理由,否则请避免在CentOS 7上使用Oracle JDK。OpenJDK在功能上已经完全可以满足99%的需求,且避免了潜在的许可风险。

2.3 安装方式决策树

确定了发行版后,我们还要选择安装方法:

  1. YUM/DNF安装(推荐给绝大多数用户)

    • 优点:极其简单,一条命令;自动管理依赖和更新;与系统完美集成。
    • 缺点:仓库中的版本可能不是最新的小版本;安装路径由系统包管理器固定(通常是/usr/lib/jvm/)。
    • 适用:快速搭建标准环境,追求稳定和易维护。
  2. 手动下载RPM包安装

    • 优点:可以安装特定的小版本号;依然算是一种“包管理”安装,会注册到系统。
    • 缺点:需要手动寻找和下载RPM包;更新需要手动操作。
    • 适用:需要精确控制OpenJDK小版本,且希望保留一些包管理特性的场景。
  3. 手动下载TAR包解压(最灵活,也最手动)

    • 优点:极度灵活,可以安装在任何路径;可以在一台机器上轻松安装和管理多个JDK版本。
    • 缺点:所有事情都需要手动完成:下载、解压、设置环境变量、创建软链接等;系统不会将其视为一个已安装的“包”。
    • 适用:开发者本地环境需要频繁切换JDK版本;对安装目录有强制要求;学习JDK内部结构的极佳方式。

在本指南中,我们将重点讲解最推荐的YUM安装和最灵活/通用的TAR包手动安装两种方式,确保你能覆盖绝大部分实际需求。

3. 实操准备:系统检查与清理

在开始安装前,花几分钟时间做好准备工作,可以避免很多后续的混乱。

3.1 检查现有Java环境

首先,我们需要查看系统是否已经安装了Java,以及安装了什么。

java -version

如果系统返回类似“command not found”的信息,说明没有安装任何JDK。如果返回了版本信息,例如:

openjdk version "1.8.0_392" OpenJDK Runtime Environment (build 1.8.0_392-b08) OpenJDK 64-Bit Server VM (build 25.392-b08, mixed mode)

这说明已经安装了OpenJDK 8。你需要决定是保留它、升级它,还是卸载它再安装新版本。

接下来,查看更详细的信息,找到JDK的安装路径,这对后续配置至关重要。

which java

这个命令通常返回/usr/bin/java,但这只是一个指向实际Java可执行文件的软链接。

ls -l /usr/bin/java

你会看到类似这样的输出:

lrwxrwxrwx. 1 root root 22 Apr 10 10:00 /usr/bin/java -> /etc/alternatives/java

继续追踪:

ls -l /etc/alternatives/java

最终你会找到真实的Java二进制文件路径,例如:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.392.x86_64/jre/bin/java。记下/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.392.x86_64这个路径,它就是JAVA_HOME的候选值。

3.2 卸载旧版本(如需)

如果你需要安装一个全新的版本,或者现有的版本不符合要求,可以考虑卸载。请谨慎操作,确保不会影响正在运行的服务。

对于通过YUM安装的OpenJDK

# 查询已安装的java相关包 rpm -qa | grep -i java # 输出可能包含:java-1.8.0-openjdk-headless-1.8.0.392-1.b08.el7.x86_64 # java-1.8.0-openjdk-1.8.0.392-1.b08.el7.x86_64 # javapackages-tools-3.4.1-11.el7.noarch # 卸载JDK包 (以openjdk 1.8.0为例,请根据实际查询到的包名操作) sudo yum remove -y java-1.8.0-openjdk java-1.8.0-openjdk-headless

-headless包是运行无头环境(没有图形界面)所必需的,通常服务器环境安装这个就够了。如果你之前安装了带图形支持的版本,包名可能不带headless

对于手动安装的版本:如果之前是手动解压TAR包安装的,直接删除解压的目录,并清理/etc/profile或用户~/.bashrc中相关的环境变量配置即可。

实操心得:在生产服务器上,除非万不得已,不要轻易卸载正在被业务使用的Java版本。建议先在新目录安装新版本,配置好环境并充分测试后,再考虑替换或移除旧版本。可以使用alternatives命令来管理系统中的多版本Java,实现平滑切换。

4. 方案一:使用YUM安装OpenJDK(最快捷)

这是最推荐给新手和追求效率的运维人员的方案。我们以安装OpenJDK 8和OpenJDK 11为例。

4.1 搜索可用的OpenJDK版本

首先,查看YUM仓库中提供了哪些OpenJDK包。

sudo yum search openjdk

你会看到一长串列表,重点关注名称中带版本号的开发包,例如:

  • java-1.8.0-openjdk(OpenJDK 8 运行时环境)
  • java-1.8.0-openjdk-devel(OpenJDK 8 开发工具包 -包含编译器javac等,这才是完整的JDK)
  • java-11-openjdk(OpenJDK 11 运行时环境)
  • java-11-openjdk-devel(OpenJDK 11 开发工具包)

关键点:如果你只需要运行Java程序(例如运行一个Spring Boot的JAR包),安装java-xx-openjdk就够了。但如果你是开发者,需要编译Java源码(使用javac),或者某些构建工具(如Maven、Gradle)明确要求JDK环境,那么必须安装devel版本。通常,为了环境完整,我建议直接安装devel版本。

4.2 安装OpenJDK 8

# 安装OpenJDK 8开发工具包(JDK) sudo yum install -y java-1.8.0-openjdk-devel # 安装完成后,验证安装 java -version javac -version

如果两个命令都能正确输出版本信息(java版本为1.8.x,javac版本也为1.8.x),说明安装成功。

4.3 安装OpenJDK 11

如果你的应用需要更新的Java特性,可以安装OpenJDK 11。CentOS 7的默认仓库可能已经包含,如果没有,可能需要配置EPEL等额外仓库。但通常直接安装即可。

# 安装OpenJDK 11开发工具包(JDK) sudo yum install -y java-11-openjdk-devel

安装后,系统会同时存在两个版本的Java。此时java -version显示的可能是后安装的版本,因为alternatives系统更新了软链接。我们需要学习如何管理和切换。

4.4 管理多个Java版本(使用alternatives)

CentOS使用alternatives命令来管理系统中多个同类型软件的命令链接。这对于管理多个JDK版本非常有用。

# 查看当前系统中所有已注册的java命令 sudo alternatives --config java # 输出示例: There are 2 programs which provide 'java'. Selection Command ----------------------------------------------- *+ 1 java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.392.x86_64/jre/bin/java) 2 java-11-openjdk.x86_64 (/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-0.el7_9.x86_64/bin/java) Enter to keep the current selection[+], or type selection number:

你可以输入对应的数字(如2)然后回车,来切换系统默认的java命令指向OpenJDK 11。同样,可以管理javac命令:

sudo alternatives --config javac

YUM安装的路径:通过YUM安装的JDK,其JAVA_HOME路径有规律可循,通常位于/usr/lib/jvm/目录下,并以Java版本命名。例如:

  • OpenJDK 8:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.392.x86_64(注意,这个路径下的jre目录是JRE,其上一级才是JDK的JAVA_HOME。更准确的方法是使用dirname $(dirname $(readlink -f $(which java)))命令动态获取)
  • OpenJDK 11:/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-0.el7_9.x86_64

5. 方案二:手动安装TAR包(最灵活)

当你需要特定小版本、希望自定义安装目录,或者需要在一台机器上维护多个独立JDK版本时,手动安装是最好的选择。这里我们以从Adoptium(原AdoptOpenJDK)网站下载OpenJDK为例。

5.1 下载JDK TAR包

首先,访问 Adoptium Temurin 网站。选择你需要的版本(如11)、架构(x64)和包类型(.tar.gz)。使用wget命令在服务器上下载。

# 创建一个专门的目录存放下载的JDK,这里以/opt/software为例 sudo mkdir -p /opt/software cd /opt/software # 下载OpenJDK 11的tar包 (请替换为实际找到的最新链接) # 注意:以下链接仅为示例,请从官网获取最新稳定版的直接下载链接 sudo wget https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.23%2B9/OpenJDK11U-jdk_x64_linux_hotspot_11.0.23_9.tar.gz # 如果wget速度慢,可以先在本地下载,然后通过scp或sftp工具上传到服务器。

5.2 解压与目录规划

规划好你的安装目录。通常,第三方软件习惯安装在/opt/usr/local下。我们将JDK解压到/usr/local/java/目录,这是一个常见的约定。

# 创建目标目录 sudo mkdir -p /usr/local/java # 解压下载的tar包到目标目录 sudo tar -xzf OpenJDK11U-jdk_x64_linux_hotspot_11.0.23_9.tar.gz -C /usr/local/java/ # 查看解压后的目录 ls -lh /usr/local/java/ # 你会看到一个类似 `jdk-11.0.23+9` 的目录

为了便于管理,我们可以创建一个软链接,指向当前使用的JDK版本。

cd /usr/local/java sudo ln -s jdk-11.0.23+9/ current-jdk

这样,/usr/local/java/current-jdk就始终指向我们当前激活的JDK版本。未来升级时,只需解压新版本,然后更改这个软链接的目标即可,无需改动环境变量。

5.3 配置系统环境变量

这是手动安装最关键的一步,我们需要告诉系统Java的位置。有两种主要方式:系统级配置用户级配置

系统级配置(推荐用于服务器):修改/etc/profile文件,对所有用户生效。

sudo vim /etc/profile

在文件末尾添加以下内容:

# 设置 JAVA_HOME,指向我们创建的软链接 export JAVA_HOME=/usr/local/java/current-jdk # 将 JDK 的 bin 目录添加到 PATH 环境变量中 export PATH=$JAVA_HOME/bin:$PATH

配置解析

  • JAVA_HOME:许多Java应用和工具(如Tomcat, Maven, Gradle)都依赖这个变量来定位Java安装根目录。
  • PATH=$JAVA_HOME/bin:$PATH:将$JAVA_HOME/bin添加到PATH的最前面。这样,当你在终端输入javajavac时,系统会优先使用我们自定义的JDK版本。:$PATH表示保留原有的PATH内容。

用户级配置:如果只想为当前用户配置,可以编辑用户家目录下的~/.bashrc文件,添加同样的两行export语句。

5.4 使环境变量生效并验证

修改完配置文件后,需要让配置立即在当前终端生效,或者新开一个终端。

# 重新加载 /etc/profile 文件 source /etc/profile # 验证配置 echo $JAVA_HOME # 应输出:/usr/local/java/current-jdk which java # 应输出:/usr/local/java/current-jdk/bin/java java -version javac -version # 应正确显示你安装的OpenJDK 11版本信息

重要注意事项source /etc/profile只对当前登录的Shell会话生效。如果你是通过SSH新开了一个连接,或者希望永久生效,最简单的方法是退出当前SSH会话并重新登录。此时再执行java -version,应该就能看到新配置的JDK版本了。

6. 深入配置与优化

安装完成并验证通过后,还有一些配置可以优化你的Java环境。

6.1 验证JAVA_HOME被正确识别

除了用echo $JAVA_HOME查看,一个更可靠的测试方法是使用一个依赖JAVA_HOME的简单命令。

# 这个命令会列出JAVA_HOME指向目录下的所有内容,如果设置正确,会正常列出文件 ls -l $JAVA_HOME # 或者,使用java命令本身来打印一些系统属性,其中包含java.home java -XshowSettings:properties -version 2>&1 | grep 'java.home'

如果这些命令都能成功执行,说明JAVA_HOME配置无误。

6.2 配置默认字符集(解决中文乱码)

CentOS 7默认的语言环境可能不包含完整的中文字符集,导致Java程序输出或日志中的中文变成乱码(方块或问号)。我们可以通过设置Java的file.encoding和系统语言环境来解决。

首先,检查系统当前的语言环境:

locale

如果LANGLC_ALL不是zh_CN.UTF-8en_US.UTF-8这类UTF-8编码,就需要设置。

方法一:修改系统全局语言环境(推荐)

# 编辑locale配置文件 sudo vim /etc/locale.conf # 添加或修改为: LANG="en_US.UTF-8" # 或者使用中文 # LANG="zh_CN.UTF-8" # 使配置生效 (可能需要重启系统或重新登录) source /etc/locale.conf # 也可以临时设置 export LANG=en_US.UTF-8

方法二:在启动Java应用时指定字符集对于特定的应用,你可以在启动命令中强制指定字符集:

java -Dfile.encoding=UTF-8 -jar your-application.jar

6.3 调整JVM默认内存参数(可选)

对于服务器应用,根据硬件情况调整JVM的初始堆内存(Xms)和最大堆内存(Xmx)是常见的优化手段。但这通常是在启动具体应用时设置,例如:

java -Xms512m -Xmx2048m -jar your-application.jar

不建议在系统环境变量中设置全局的JVM内存参数,因为不同的应用需求差异很大。这个配置应该作为应用启动脚本的一部分。

7. 常见问题与故障排查实录

即使按照步骤操作,你也可能会遇到一些问题。这里记录了一些典型场景和解决方法。

7.1 问题:java -version显示旧版本或报错“command not found”

可能原因及排查

  1. 环境变量未生效:这是最常见的原因。执行source /etc/profile后只在当前终端生效。请确保你是在配置环境变量的同一个终端窗口里执行java -version,或者重新开启一个SSH连接
  2. PATH顺序问题:检查echo $PATH,确保$JAVA_HOME/bin的路径出现在输出结果的前面。如果系统自带的或其他地方的Java路径在前面,会被优先使用。
  3. JAVA_HOME设置错误:仔细检查/etc/profileJAVA_HOME的路径。确保路径存在且指向正确的JDK目录(该目录下应有bin,lib等子目录)。可以使用ls -l $JAVA_HOME来验证。
  4. 安装了JRE而非JDK:如果你只安装了java-xx-openjdk(没有-devel),那么只有java命令,没有javac命令。java -version可能正常,但javac -version会报错。你需要安装devel包。

解决方案

  • 对于手动安装,请严格按照第5.3和5.4节操作,并务必重新登录SSH
  • 使用which java命令查看当前生效的java命令路径,用ls -l追踪软链接,最终找到实际使用的JDK位置,与你设置的JAVA_HOME对比。

7.2 问题:通过YUM安装后,JAVA_HOME环境变量如何设置?

解答:YUM安装的OpenJDK,其JAVA_HOME路径是固定的。一个可靠的方法是使用命令动态获取:

# 将以下两行添加到 /etc/profile 中 export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java)))) export PATH=$JAVA_HOME/bin:$PATH

这个命令组合的作用是:1.which java找到java命令路径;2.readlink -f解析出最终的真实二进制文件路径;3. 两次dirname向上回退两级,得到JDK的根目录。这种方法比写死路径更灵活,即使未来通过alternatives切换了Java版本,JAVA_HOME也能自动更新。

7.3 问题:如何彻底卸载手动安装的JDK?

步骤

  1. 删除JDK安装目录:sudo rm -rf /usr/local/java/jdk-11.0.23+9(请替换为你的实际路径)。
  2. 删除我们创建的软链接:sudo rm -rf /usr/local/java/current-jdk
  3. 编辑/etc/profile~/.bashrc,删除或注释掉之前添加的export JAVA_HOMEexport PATH相关行。
  4. 执行source /etc/profile或重新登录终端,使更改生效。
  5. 验证:java -version应提示命令未找到或变回系统其他版本。

7.4 问题:应用程序(如Tomcat)启动时找不到JAVA_HOME

排查

  1. 首先,在启动应用的用户(如tomcat用户)下,检查环境变量:
    sudo -u tomcat bash -c 'echo $JAVA_HOME'
    如果输出为空,说明该用户的环境变量没有设置。
  2. 原因/etc/profile只在交互式登录Shell(如通过控制台、ssh登录)时读取。而通过系统服务(如systemd)启动的Tomcat,其运行环境是非交互式Shell,不会读取/etc/profile
  3. 解决方案:对于通过systemd管理的服务,正确的做法是在服务的配置文件(如tomcat.service)中设置环境变量。
    sudo vim /etc/systemd/system/tomcat.service # 在 [Service] 部分添加 Environment="JAVA_HOME=/usr/local/java/current-jdk"
    然后重新加载systemd配置并重启服务:
    sudo systemctl daemon-reload sudo systemctl restart tomcat

7.5 问题:安装过程中YUM报错,提示没有可用包

可能原因

  1. 仓库未更新:运行sudo yum clean all && sudo yum makecache更新仓库元数据。
  2. 仓库中确实没有:对于较新的OpenJDK版本(如17+),CentOS 7默认仓库可能不提供。这时需要添加第三方仓库,如EPEL(Extra Packages for Enterprise Linux)或直接使用Adoptium的RPM仓库。但更简单的做法是采用手动TAR包安装。

经过以上步骤,你应该已经在CentOS 7系统上成功部署了一个稳定且配置完善的JDK环境。从选择发行版到安装方式,从环境变量配置到故障排查,每一个环节都力求清晰。记住,在Linux世界,理解原理比记住命令更重要。当你下次再遇到Java环境问题时,希望这份详细的记录能帮你快速定位并解决。

← 返回列表