OpenJDK 是 Java SE 標準的開源參考實現,CentOS 官方倉庫提供預編譯 RPM 包,是生產環境最穩定、便捷的安裝方式。本文涵蓋 JDK 8/11/17/21 安裝、JAVA_HOME 配置、alternatives 切換、容器化部署建議。
| OpenJDK 版本 | 包名 (CentOS 7) | 包名 (CentOS 8/9) | LTS 狀態 | 推薦場景 |
|---|---|---|---|---|
| Java 8 (1.8.0) | java-1.8.0-openjdk | java-1.8.0-openjdk | LTS (至 2030+) | 舊系統維護、兼容性優先 |
| Java 11 | java-11-openjdk | java-11-openjdk | LTS (至 2026+) | 主流生產環境標準 |
| Java 17 | EPEL: java-17-openjdk | java-17-openjdk | LTS (至 2029+) | 新項目首選、長期支持 |
| Java 21 | 不可用 | java-21-openjdk | LTS (至 2031+) | 最新特性、長期支持 |
# 1. 搜索可用包
yum search openjdk | grep -i jdk
# 2. 安裝 JRE (僅運行)
yum install -y java-11-openjdk
# 3. 安裝 JDK (開發/編譯/生產推薦)
yum install -y java-11-openjdk-devel
# 4. 安裝頭文件/源碼 (JNI/調試需要)
yum install -y java-11-openjdk-headless java-11-openjdk-src
# 5. 查看安裝路徑
rpm -ql java-11-openjdk-devel | grep -E "(bin/javac|lib/jvm)"
# 典型路徑: /usr/lib/jvm/java-11-openjdk-11.0.x.x.x-x.el7.x86_64
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* epel: mirrors.aliyun.com
* updates: mirrors.aliyun.com
Resolving Dependencies
--> Running transaction check
---> Package java-11-openjdk-devel.x86_64 1:11.0.20.0.8-1.el7_9 will be installed
--> Processing Dependency: java-11-openjdk-headless = 1:11.0.20.0.8-1.el7_9
--> Processing Dependency: java-11-openjdk = 1:11.0.20.0.8-1.el7_9
--> Processing Dependency: libjvm.so(SUNWprivate_1.1)(64bit)
--> Processing Dependency: libjava.so(SUNWprivate_1.1)(64bit)
... (依賴鏈: freetype, fontconfig, giflib, libpng, lcms2, harfbuzz, graphite2, cups-libs, alsa-lib, elfutils-libs, zlib, glibc)
...
Transaction Summary
Install 1 Package (+35 Dependent packages)
Total download size: 180 M
Installed size: 380 M
Is this ok [y/d/N]: y
關鍵依賴說明:字體渲染 (freetype/fontconfig)、圖像處理 (giflib/libpng/lcms2)、音頻 (alsa-lib)、打印 (cups-libs)、國際化 (harfbuzz/graphite2)。最小化安裝可用 headless 版本避免圖形庫依賴。
# 1. 確定安裝路徑
readlink -f $(which java)
# 輸出: /usr/lib/jvm/java-11-openjdk-11.0.20.0.8-1.el7_9.x86_64/bin/java
# JAVA_HOME 為: /usr/lib/jvm/java-11-openjdk-11.0.20.0.8-1.el7_9.x86_64
# 2. 配置 /etc/profile.d/java.sh (推薦,全局生效)
cat > /etc/profile.d/java.sh <<'EOF'
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
EOF
# 3. 立即生效
source /etc/profile.d/java.sh
# 4. 驗證
java -version
# openjdk version "11.0.20" 2023-07-18 LTS
# OpenJDK Runtime Environment 18.9 (build 11.0.20+8-LTS)
# OpenJDK 64-Bit Server VM 18.9 (build 11.0.20+8-LTS, mixed mode, sharing)
javac -version
# javac 11.0.20
# 查看當前默認版本
alternatives --display java
# 列出所有已安裝 Java
alternatives --list | grep java
# 切換默認版本 (交互式)
alternatives --config java
# 手動設置優先級 (數字越大優先級越高)
alternatives --install /usr/bin/java java /usr/lib/jvm/java-17-openjdk/bin/java 1700
alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-17-openjdk/bin/javac 1700
# 同步切換 javac/javaws/jar 等工具
alternatives --config javac
# 基於官方精簡鏡像 (推薦)
FROM eclipse-temurin:17-jre-alpine
# 或構建自定義
FROM registry.access.redhat.com/ubi8/ubi-minimal
# 安裝 OpenJDK 17 (微鏡像)
RUN microdnf install -y java-17-openjdk-headless \
&& microdnf clean all
# 設置 JAVA_HOME (ubi 鏡像路徑可能不同)
ENV JAVA_HOME=/usr/lib/jvm/java-17-openjdk
ENV PATH=$JAVA_HOME/bin:$PATH
# 創建非 root 用戶
RUN useradd -r -s /sbin/nologin appuser
USER appuser
# 複製應用
COPY target/app.jar /app/app.jar
ENTRYPOINT ["java", "-XX:+UseContainerSupport", "-XX:MaxRAMPercentage=75.0", "-jar", "/app/app.jar"]
| 問題 | 原因 | 解決 |
|---|---|---|
| java: command not found | PATH 未包含 JAVA_HOME/bin | source /etc/profile 或重新登錄 | 版本不匹配 (如需要 11 卻是 8) | alternatives --config java 切換 |
| SSL 握手失敗 / 憑證錯誤 | ca-certificates 未安裝或過期 | yum install -y ca-certificates && update-ca-trust |
| 字體渲染異常 / 圖表無中文 | 缺少中文字體 | yum install -y google-noto-sans-cjk-fonts 或複製字體到 $JAVA_HOME/lib/fonts |
| 容器內 OOM / CPU 限制不生效 | JVM 未識別 cgroup 限制 | 添加 -XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0 (JDK 10+) |
| yum 安裝極慢 / 失敗 | 鏡像源問題 | 配置阿里雲/清華源: yum-config-manager --add-repo https://mirrors.aliyun.com/repo/Centos-7.repo |
yum update java-* 修補 CVEheadless 版本減少攻擊面-Djdk.tls.client.protocols=TLSv1.2,TLSv1.3jlink 定製無模塊化運行時 (需模塊化應用)