一、为什么选择CentOS + Java?
在企业级开发中,CentOS凭借其稳定性、安全性和与Red Hat Enterprise Linux(RHEL)的高度兼容性,长期占据服务器操作系统的半壁江山。而Java作为后端开发的"第一语言",在CentOS上的部署更是家常便饭。
无论你是要部署Spring Boot微服务、搭建Tomcat Web容器,还是运行Hadoop、Elasticsearch等大数据组件,第一步永远是——把Java环境装好。
但问题来了:CentOS默认可能自带OpenJDK,版本可能不是你想要的;yum源里的版本可能太老;手动下载安装又涉及环境变量配置……这些问题如果不搞清楚,轻则编译报错,重则线上事故。
别急,咱们一步步来。
二、安装前的"体检":检查系统自带Java
在动手之前,必须先搞清楚系统里到底有没有Java,有什么版本的Java。 这一步很多人跳过,结果后面装了两个JDK互相打架,排查起来焦头烂额。
2.1 查看已安装的Java包
执行以下命令:
rpm -qa | grep java
rpm -qa | grep jdk
rpm -qa | grep gcj
这三条命令会把系统中所有与Java相关的RPM包全部列出来。如果你看到类似 java-1.8.0-openjdk-1.8.0.xxx 这样的输出,说明系统自带了OpenJDK。
2.2 查看当前Java版本
java -version
如果有输出,说明当前系统已经有可执行的Java环境。但注意:自带的OpenJDK不一定满足你的项目需求。 很多企业项目明确要求Oracle JDK,或者需要特定版本(如JDK 8、JDK 11、JDK 17),这时候就必须卸载自带版本,重新安装。
2.3 卸载系统自带的Java(如有需要)
如果你决定用自己下载的JDK,那么系统自带的OpenJDK必须清理干净,否则会出现版本冲突。
方法一:逐包卸载(推荐,更可控)
rpm -qa | grep java | xargs rpm -e --nodeps
这条命令的含义是:查询所有含"java"关键词的RPM包,然后逐个强制卸载(--nodeps表示忽略依赖关系强制删除)。
方法二:批量卸载
rpm -e --nodeps java-1.8.0-openjdk-1.8.0.xxx-x.x.bxx.el7.x86_64
直接指定包名卸载,适合你已经知道具体包名的情况。
方法三:使用yum卸载(CentOS 7适用)
yum -y remove java-1.8.0-openjdk*
yum -y remove tzdata-java.noarch
注意那个星号 *,它表示把所有以 java-1.8.0-openjdk 开头的包全部卸载,连带 tzdata-java 这个时区数据包也一并清理。
工程师经验谈: 卸载完之后,再执行一次
rpm -qa | grep java确认输出为空,才算清理干净。别嫌麻烦,这一步省了,后面全是坑。
三、三种安装方式全解析
在CentOS上安装Java,主流方式有三种。我逐一拆解,告诉你每种方式的适用场景和操作细节。
方式一:yum在线安装(最简单,推荐新手)
这是最省事的方式,不需要手动下载任何文件,系统自动从yum源拉取安装包。
适用场景: 对Java版本没有特殊要求,只要能跑就行,比如测试环境、学习环境。
操作步骤:
# 1. 查看yum源中有哪些Java版本可选
yum list java*
yum list java-1.8*
# 2. 安装JDK 1.8(以OpenJDK为例)
yum -y install java-1.8.0-openjdk*
# 3. 验证安装
java -version
优点:
- 一行命令搞定,无需配置环境变量(yum会自动设置好PATH)
- 自动处理依赖关系,不会出现缺少组件的问题
- 默认安装路径在
/usr/lib/jvm/java-1.8.0-openjdk-xxx
缺点:
- 版本固定,只能装yum源里有的版本(通常是OpenJDK)
- 无法安装Oracle官方JDK
- 自带的OpenJDK在某些场景下与Oracle JDK存在细微差异
实战建议: 如果你的项目不强制要求Oracle JDK,yum安装是最高效的选择。生产环境中大量服务器就是这么装的,稳定可靠。
方式二:RPM包安装(中规中矩)
如果你需要安装Oracle官方提供的RPM格式JDK(而非tar.gz压缩包),可以用这种方式。
适用场景: 需要Oracle JDK,但不想手动解压配置环境变量。
操作步骤:
# 1. 将JDK的RPM包上传到服务器(可通过Xftp等工具)
# 2. 执行安装
rpm -ivh jdk-8u152-linux-x64.rpm
# 3. 验证
java -version
默认安装路径: /usr/java/jdk1.8.0_152
优点:
- RPM包会自动注册到系统包管理器,方便后续升级和卸载
- 不需要手动配置环境变量(部分版本会自动设置)
缺点:
- 需要提前下载RPM包,不如yum方便
- 版本选择受限于Oracle提供的RPM包
方式三:手动解压tar.gz安装(最灵活,推荐生产环境)
这是我在生产环境中最常用的方式。完全自主可控,想装什么版本就装什么版本,想放哪个目录就放哪个目录。
适用场景: 生产环境、需要特定JDK版本(如JDK 11、JDK 17)、需要Oracle JDK而非OpenJDK。
操作步骤:
Step 1:创建安装目录
mkdir -p /usr/java
# 或者
mkdir -p /usr/local/java
我个人习惯用 /usr/local/java,因为 /usr/local 本身就是存放用户自行编译安装软件的标准目录。
Step 2:上传JDK压缩包
通过Xftp、SCP或直接用wget下载。以JDK 8为例:
cd /usr/local/java
wget https://download.oracle.com/java/8/latest/jdk-8u262-linux-x64.tar.gz
# 注意:如果网络不通,可以先在本地下载,再通过Xftp上传
以JDK 11为例:
wget https://download.java.net/openjdk/jdk11/ri/openjdk-11+28_linux-x64_bin.tar.gz
以JDK 17为例:
wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz
Step 3:解压压缩包
tar -zxvf jdk-8u262-linux-x64.tar.gz
# 或者
tar -zxvf openjdk-11+28_linux-x64_bin.tar.gz -C /usr/local/java
解压完成后,你会看到类似 jdk1.8.0_262、jdk-11、jdk-17.0.x 这样的目录。
Step 4:清理压缩包(可选)
rm -f jdk-8u262-linux-x64.tar.gz
节省磁盘空间,生产环境建议保留原始包以便回滚。
四、环境变量配置:核心中的核心
手动安装方式必须配置环境变量,否则系统找不到java命令。 这一步是整个安装流程中最关键的环节,配置错了,后面所有Java程序都跑不起来。
4.1 编辑配置文件
vim /etc/profile
在文件末尾添加以下内容(以JDK 8为例):
# JDK环境变量配置
export JAVA_HOME=/usr/local/java/jdk1.8.0_262
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
如果是JDK 11或更高版本(JDK 11+不再单独提供jre目录),配置略有不同:
export JAVA_HOME=/usr/local/java/jdk-11
export CLASSPATH=.:${JAVA_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
如果是JDK 17:
export JAVA_HOME=/usr/local/java/jdk-17.0.x
export CLASSPATH=.:${JAVA_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
4.2 各个变量的含义(必须理解)
| 变量名 | 含义 | 为什么需要 |
|---|---|---|
JAVA_HOME |
JDK的安装根目录 | Tomcat、Maven、Gradle等工具都依赖这个变量来定位JDK |
JRE_HOME |
JRE的安装目录 | 部分老旧应用需要明确指定JRE路径 |
CLASSPATH |
Java类加载路径 | 告诉JVM去哪里找.class文件和jar包,.表示当前目录 |
PATH |
系统可执行命令搜索路径 | 把$JAVA_HOME/bin加入PATH后,任何目录下都能直接输入java命令 |
工程师经验谈: 很多人配置环境变量时把
PATH=$PATH:$JAVA_HOME/bin写反了,写成PATH=$JAVA_HOME/bin:$PATH。虽然两种写法都能用,但推荐把$JAVA_HOME/bin放在前面,这样系统会优先使用你安装的JDK,而不是可能存在的其他版本。
4.3 使配置生效
source /etc/profile
这条命令让配置文件立即生效,无需重启服务器。
4.4 验证安装
java -version
javac -version
java
如果看到类似以下输出,说明安装成功:
java version "1.8.0_262"
Java(TM) SE Runtime Environment (build 1.8.0_262-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.262-b10, mixed mode)
javac 1.8.0_262
三条命令都能正常输出,说明JDK和JRE都已正确安装。
五、常见问题与排错指南
在实际部署中,你一定会遇到各种问题。以下是我总结的高频故障及解决方案。
问题1:配置完环境变量后,java -version 仍然显示旧版本
原因: /etc/profile 没有生效,或者系统中存在多个Java版本,PATH优先级问题。
解决:
source /etc/profile # 重新加载配置
which java # 查看java命令实际指向哪个路径
rm -rf /usr/bin/java # 删除可能存在的软链接(谨慎操作)
ln -s $JAVA_HOME/bin/java /usr/bin/java
问题2:javac 命令找不到
原因: 只配置了JRE的路径,没有配置JDK的bin目录到PATH中。
解决: 确认 PATH=${JAVA_HOME}/bin:$PATH 这一行存在,并且 $JAVA_HOME/bin 下确实有 javac 文件。
ls $JAVA_HOME/bin/javac
问题3:Tomcat启动时报错 JRE_HOME is not set correctly
原因: Tomcat需要明确的JRE路径,而你只配置了JAVA_HOME。
解决: 在 /etc/profile 中显式添加 JRE_HOME 变量,或者在Tomcat的 setenv.sh 中手动指定:
export JRE_HOME=/usr/local/java/jdk1.8.0_262/jre
问题4:卸载不干净,新装的JDK无法使用
原因: 旧的Java包没有完全清理,RPM数据库中仍有残留。
解决:
rpm -qa | grep -i java # 再次检查
rpm -e --nodeps <包名> # 强制删除残留包
rm -rf /usr/lib/jvm/java* # 清理目录残留
问题5:防火墙导致外部无法访问8080端口
原因: CentOS默认防火墙阻止了非标准端口的入站连接。
解决:
firewall-cmd --permanent --zone=public --add-port=8080/tcp
firewall-cmd --reload
或者使用iptables:
iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
service iptables save
六、进阶:搭建完整的Java Web环境
光有JDK还不够,生产环境中你通常还需要Tomcat。下面快速过一遍在天翼云CentOS主机上部署Java Web环境的完整流程。
6.1 安装Tomcat
方式一:yum安装(最快)
yum -y install tomcat tomcat-webapps tomcat-admin-webapps
默认安装路径:/usr/share/tomcat/
方式二:手动安装(更灵活)
cd /usr/local
wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.78/bin/apache-tomcat-8.5.78.tar.gz
tar -zxvf apache-tomcat-8.5.78.tar.gz
6.2 配置Tomcat环境变量
在 /etc/profile 末尾追加:
export CATALINA_BASE=/usr/share/tomcat
export CATALINA_HOME=/usr/share/tomcat
export PATH=$PATH:$CATALINA_HOME/bin
执行 source /etc/profile 生效。
6.3 配置Tomcat用户权限
编辑 /usr/share/tomcat/conf/tomcat-users.xml:
<tomcat-users>
<user username="admin" password="你的密码" roles="manager-gui,admin-gui"/>
</tomcat-users>
6.4 启动与验证
systemctl start tomcat
systemctl enable tomcat # 设置开机自启
systemctl status tomcat # 查看状态
修改端口(如需):编辑 /usr/share/tomcat/conf/server.xml,将8080改为其他端口(如9090),然后重启。
curl http://localhost:9090
本地测试通过后,在安全组中开放对应端口,外部即可通过 http://公网IP:9090 访问。
七、版本选择建议:JDK 8 / 11 / 17 怎么选?
| 版本 | 状态 | 适用场景 |
|---|---|---|
| JDK 8 | 长期支持(LTS),依然广泛使用 | 老项目维护、Spring Boot 2.x、大量存量系统 |
| JDK 11 | LTS,2018年发布 | 新项目首选、Spring Boot 2.5+、模块化支持 |
| JDK 17 | LTS,2021年发布 | 最新长期支持版本、Spring Boot 3.x、强封装 |
| JDK 21 | LTS,2023年发布 | 追求最新特性、虚拟线程等新功能 |
我的建议: 新项目直接上JDK 17,老项目维持JDK 8,过渡期用JDK 11。别追最新的非LTS版本,生产环境求稳。
八、总结
在CentOS上安装Java环境,说难不难,说简单也绝不是"下一步、下一步"就能搞定的事。核心就三件事:
- 清理干净 —— 卸载系统自带的OpenJDK,避免版本冲突
- 选对方式 —— 测试环境用yum,生产环境用手动tar.gz安装
- 配好变量 —— JAVA_HOME、PATH、CLASSPATH一个都不能少,
source /etc/profile别忘了执行
这套流程我在天翼云的多台CentOS主机上反复验证过,从JDK 8到JDK 17,从单节点到集群部署,稳定可靠。希望这篇文章能帮你在Linux服务器上快速建立起坚实的Java开发地基。