在 Fedora 上安装 Java:只有 OpenJDK 25,要 21/17 怎么办
先给一个很多人会踩的坑:Fedora 45 的仓库里没有 Java 21,也没有 Java 17。
先看仓库里到底有什么
Section titled “先看仓库里到底有什么”dnf list --available 'java-*-openjdk.x86_64'java-25-openjdk.x86_64 1:25.0.4.1.1-1.1.fc45java-latest-openjdk.x86_64 1:27.0.0.0.35-0.0.1.0.ea.fc45只有两个:25(当前 LTS) 和 java-latest(27 早期预览)。
这不是装错源。对比三代仓库:
| 版本 | 提供的 JDK |
|---|---|
| F43 | java-21、java-25、java-latest |
| F44 | java-25、java-latest |
| F45 | java-25、java-latest |
Java 21 在 F44 就被移除了。 所以照着老教程 dnf install java-21-openjdk 会得到 No match for argument。
装 JDK 25
Section titled “装 JDK 25”sudo dnf install java-25-openjdk只跑服务端程序可以装更小的 headless:
sudo dnf install java-25-openjdk-headless验证:
java -versionopenjdk version "25.0.4.1" 2026-08-18OpenJDK Runtime Environment (Red_Hat-25.0.4.1.1-1) (build 25.0.4.1+1)OpenJDK 64-Bit Server VM (Red_Hat-25.0.4.1.1-1) (build 25.0.4.1+1, mixed mode, sharing)装到哪了:
readlink -f "$(command -v java)"java -XshowSettings:properties -version 2>&1 | grep java.home/usr/lib/jvm/java-25-openjdk/bin/java java.home = /usr/lib/jvm/java-25-openjdkJAVA_HOME 怎么设
Section titled “JAVA_HOME 怎么设”很多构建工具(Maven、Gradle、Tomcat)依赖 JAVA_HOME,而 Fedora 默认不设:
echo $JAVA_HOME # 空写进 profile:
sudo tee /etc/profile.d/java.sh >/dev/null <<'EOF'export JAVA_HOME=/usr/lib/jvm/java-25-openjdkexport PATH=$JAVA_HOME/bin:$PATHEOFsource /etc/profile.d/java.shecho $JAVA_HOME跑个最小程序
Section titled “跑个最小程序”cat > Hello.java <<'EOF'public class Hello { public static void main(String[] args) { System.out.println("Java " + System.getProperty("java.version")); }}EOFjava Hello.javaJDK 11 之后支持单文件直接运行,不需要先 javac:
Java 25.0.4.1需要 Java 21 或 17 怎么办
Section titled “需要 Java 21 或 17 怎么办”仓库里没有,只有三条路:
一、容器(最省事)
Section titled “一、容器(最省事)”podman run --rm eclipse-temurin:21-jdk java -version应用跑在容器里,宿主机不用装旧 JDK。这也是 Fedora 官方推荐的方向。
二、上游 tarball(要本机 JDK 时)
Section titled “二、上游 tarball(要本机 JDK 时)”mkdir -p ~/jdk && cd ~/jdkcurl -LO https://github.com/adoptium/temurin21-binaries/releases/latest/download/OpenJDK21U-jdk_x64_linux_hotspot.tar.gztar xzf OpenJDK21U-jdk_x64_linux_hotspot.tar.gzexport JAVA_HOME=~/jdk/jdk-21*$JAVA_HOME/bin/java -version三、SDKMAN(开发机多版本切换)
Section titled “三、SDKMAN(开发机多版本切换)”curl -s "https://get.sdkman.io" | bashsource ~/.sdkman/bin/sdkman-init.shsdk install java 21.0.5-temsdk use java 21.0.5-tem适合需要频繁在 17/21/25 之间切换的开发场景。
| 现象 | 原因 |
|---|---|
No match for argument: java-21-openjdk | F44 起已移除,不是源的问题 |
JAVA_HOME 是空的 | Fedora 不默认设置,要自己写 profile |
装了 JDK 但 java 找不到 | 只装了 -headless 且没装 JRE 包,或 PATH 未含 $JAVA_HOME/bin |
| 两个 JDK 并存时版本不对 | 用 update-alternatives --config java 或直接改 JAVA_HOME |
- 工具链与多版本共存 — Fedora 上多版本的总体策略
- 容器与 rootless — 用容器隔离旧版 JDK
- 模块流(已废弃) — 为什么不再有”切版本线”这条路
- Fedora 仓库与 dnf5 — 装包基础
- 官方:Java