在Fedora中安装指定版本的JDK

Java开发者不能没有JDK,就像西方不能没有耶路撒冷。

近期准备使用Linux作为开发主力系统,相对比较熟悉的发行版是远古版本的CentOS7,且早已停止维护,就选择了与CentOS同出一源的Fedora。我选择的是 Fedora Workstation 42。系统安装就不过多赘述了,现在版本比较新的Linux发行版的安装都是比较友好的(大部分)。

截至到写这篇文章的时间,最新的Fedora 42默认安装的 OpenJDK版本是 21.0.7,虽然 Java21也是长期支持版(应该是)。但是我目前常用的还是 Java8,所以需要手动安装一个1.8版本的JDK。

介绍两种安装制定版本JDK的方法:

使用dnf安装OpenJDK

首先打开我们的终端模拟器,输入以下命令搜索可以安装的 OpenJDK

dnf search openjdk

可以得到类似下边的输出

仓库更新和加载中:
 google-chrome                          100% |   2.3 KiB/s |   1.3 KiB |  00m01s
仓库加载完成。
Matched fields: name, summary
 ant-openjdk21.noarch: ant binding for openjdk21
 java-21-openjdk.x86_64: OpenJDK 21 Runtime Environment
 java-21-openjdk-demo.x86_64: OpenJDK 21 Demos
 java-21-openjdk-demo-fastdebug.x86_64: OpenJDK 21 Demos optimised with full debugging on
 java-21-openjdk-demo-slowdebug.x86_64: OpenJDK 21 Demos unoptimised with full debugging on
 java-21-openjdk-devel.x86_64: OpenJDK 21 Development Environment
 java-21-openjdk-devel-fastdebug.x86_64: OpenJDK 21 Development Environment optimised with full debugging on
 java-21-openjdk-devel-slowdebug.x86_64: OpenJDK 21 Development Environment unoptimised with full debugging on
 java-21-openjdk-fastdebug.x86_64: OpenJDK 21 Runtime Environment optimised with full debugging on
 java-21-openjdk-headless.x86_64: OpenJDK 21 Headless Runtime Environment
 java-21-openjdk-headless-fastdebug.x86_64: OpenJDK 21 Runtime Environment optimised with full debugging on
 java-21-openjdk-headless-slowdebug.x86_64: OpenJDK 21 Runtime Environment unoptimised with full debugging on
 java-21-openjdk-javadoc.x86_64: OpenJDK 21 API documentation
 java-21-openjdk-javadoc-zip.x86_64: OpenJDK 21 API documentation compressed in a single archive
 java-21-openjdk-jmods.x86_64: JMods for OpenJDK 21
 java-21-openjdk-jmods-fastdebug.x86_64: JMods for OpenJDK 21 optimised with full debugging on
 java-21-openjdk-jmods-slowdebug.x86_64: JMods for OpenJDK 21 unoptimised with full debugging on
 java-21-openjdk-portable.x86_64: OpenJDK 21 Runtime Environment portable edition
 java-21-openjdk-portable-devel.x86_64: OpenJDK 21 Development Environment portable edition
 java-21-openjdk-portable-devel-fastdebug.x86_64: OpenJDK 21 Runtime and Development Environment portable edition optimised with full debugging on
 java-21-openjdk-portable-devel-slowdebug.x86_64: OpenJDK 21 Runtime and Development Environment portable edition unoptimised with full debugging on
 java-21-openjdk-portable-docs.x86_64: OpenJDK 21 API documentation
 java-21-openjdk-portable-fastdebug.x86_64: OpenJDK 21 Runtime Environment portable edition optimised with full debugging on
 java-21-openjdk-portable-misc.x86_64: OpenJDK 21 miscellany
 java-21-openjdk-portable-slowdebug.x86_64: OpenJDK 21 Runtime Environment portable edition unoptimised with full debugging on
 java-21-openjdk-portable-sources.x86_64: OpenJDK 21 full patched sources of portable JDK
 java-21-openjdk-portable-static-libs.x86_64: OpenJDK 21 libraries for static linking - portable edition
 java-21-openjdk-portable-static-libs-fastdebug.x86_64: OpenJDK 21 libraries for static linking - portable edition optimised with full debugging on
 java-21-openjdk-portable-static-libs-slowdebug.x86_64: OpenJDK 21 libraries for static linking - portable edition unoptimised with full debugging on
 java-21-openjdk-portable-unstripped.x86_64: The OpenJDK 21 runtime environment.
 java-21-openjdk-slowdebug.x86_64: OpenJDK 21 Runtime Environment unoptimised with full debugging on
 java-21-openjdk-src.x86_64: OpenJDK 21 Source Bundle
 java-21-openjdk-src-fastdebug.x86_64: OpenJDK 21 Source Bundle for packages with debugging on and optimisation
 java-21-openjdk-src-slowdebug.x86_64: OpenJDK 21 Source Bundle for packages with debugging on and no optimisation
 java-21-openjdk-static-libs.x86_64: OpenJDK 21 libraries for static linking
 java-21-openjdk-static-libs-fastdebug.x86_64: OpenJDK 21 libraries for static linking optimised with full debugging on
 java-21-openjdk-static-libs-slowdebug.x86_64: OpenJDK 21 libraries for static linking unoptimised with full debugging on
 java-latest-openjdk.x86_64: OpenJDK 24 Runtime Environment
 java-latest-openjdk-demo.x86_64: OpenJDK 24 Demos
 java-latest-openjdk-demo-fastdebug.x86_64: OpenJDK 24 Demos optimised with full debugging on
 java-latest-openjdk-demo-slowdebug.x86_64: OpenJDK 24 Demos unoptimised with full debugging on
 java-latest-openjdk-devel.x86_64: OpenJDK 24 Development Environment
 java-latest-openjdk-devel-fastdebug.x86_64: OpenJDK 24 Development Environment optimised with full debugging on
 java-latest-openjdk-devel-slowdebug.x86_64: OpenJDK 24 Development Environment unoptimised with full debugging on
 java-latest-openjdk-fastdebug.x86_64: OpenJDK 24 Runtime Environment optimised with full debugging on
 java-latest-openjdk-headless.x86_64: OpenJDK 24 Headless Runtime Environment
 java-latest-openjdk-headless-fastdebug.x86_64: OpenJDK 24 Runtime Environment optimised with full debugging on
 java-latest-openjdk-headless-slowdebug.x86_64: OpenJDK 24 Runtime Environment unoptimised with full debugging on
 java-latest-openjdk-javadoc.x86_64: OpenJDK 24 API documentation
 java-latest-openjdk-javadoc-zip.x86_64: OpenJDK 24 API documentation compressed in a single archive
 java-latest-openjdk-jmods.x86_64: JMods for OpenJDK 24
 java-latest-openjdk-jmods-fastdebug.x86_64: JMods for OpenJDK 24 optimised with full debugging on
 java-latest-openjdk-jmods-slowdebug.x86_64: JMods for OpenJDK 24 unoptimised with full debugging on
 java-latest-openjdk-portable.x86_64: OpenJDK 24 Runtime Environment portable edition
 java-latest-openjdk-portable-devel.x86_64: OpenJDK 24 Development Environment portable edition
 java-latest-openjdk-portable-devel-fastdebug.x86_64: OpenJDK 24 Runtime and Development Environment portable edition optimised with full debugging on
 java-latest-openjdk-portable-devel-slowdebug.x86_64: OpenJDK 24 Runtime and Development Environment portable edition unoptimised with full debugging on
 java-latest-openjdk-portable-docs.x86_64: OpenJDK 24 API documentation
 java-latest-openjdk-portable-fastdebug.x86_64: OpenJDK 24 Runtime Environment portable edition optimised with full debugging on
 java-latest-openjdk-portable-misc.x86_64: OpenJDK 24 miscellany
 java-latest-openjdk-portable-slowdebug.x86_64: OpenJDK 24 Runtime Environment portable edition unoptimised with full debugging on
 java-latest-openjdk-portable-sources.x86_64: OpenJDK 24 full patched sources of portable JDK
 java-latest-openjdk-portable-static-libs.x86_64: OpenJDK 24 libraries for static linking - portable edition
 java-latest-openjdk-portable-static-libs-fastdebug.x86_64: OpenJDK 24 libraries for static linking - portable edition optimised with full debugging on
 java-latest-openjdk-portable-static-libs-slowdebug.x86_64: OpenJDK 24 libraries for static linking - portable edition unoptimised with full debugging on
 java-latest-openjdk-portable-unstripped.x86_64: The OpenJDK 24 runtime environment.
 java-latest-openjdk-slowdebug.x86_64: OpenJDK 24 Runtime Environment unoptimised with full debugging on
 java-latest-openjdk-src.x86_64: OpenJDK 24 Source Bundle
 java-latest-openjdk-src-fastdebug.x86_64: OpenJDK 24 Source Bundle for packages with debugging on and optimisation
 java-latest-openjdk-src-slowdebug.x86_64: OpenJDK 24 Source Bundle for packages with debugging on and no optimisation
 java-latest-openjdk-static-libs.x86_64: OpenJDK 24 libraries for static linking
 java-latest-openjdk-static-libs-fastdebug.x86_64: OpenJDK 24 libraries for static linking optimised with full debugging on
 java-latest-openjdk-static-libs-slowdebug.x86_64: OpenJDK 24 libraries for static linking unoptimised with full debugging on
 maven-openjdk21.noarch: maven binding for openjdk21
 openjdk-asmtools-javadoc.noarch: Javadoc for openjdk-asmtools
 openjdk-asmtools7-javadoc.noarch: Javadoc for openjdk-asmtools7
 xmvn-toolchain-openjdk21.noarch: xmvn-minimal binding for openjdk21
Matched fields: name
 javapackages-local-openjdk21.noarch: Non-essential macros and scripts for Java packaging support
 maven-local-openjdk21.noarch: Macros and scripts for Maven packaging support
 openjdk-asmtools.noarch: Set of tools used to assemble / disassemble proper and improper Java .class files
 openjdk-asmtools7.noarch: Set of tools used to assemble / disassemble proper and improper Java .class files for JDK version 11 and lesser

可能是因为系统版本问题,我使用的Fedora42软件仓库中只能搜索到最新的Java24和Java21,如果仓库中有需要的版本,直接下载即可。当然,如果没有需要的版本,也是有办法安装的,我没怎么用过这种方式,就不献丑了,请自行查找相关资料。以Java21为例,执行以下命令:

sudo dnf install java-21-openjdk-devel -y

将会安装Java编译器和开发所需的工具包,如果只安装 java-xx-openjdksudo dnf install java-21-openjdk -y,只会安装Java运行环境即JRE。简而言之 java-xx-openjdk-devel是JDK,java-xx-openjdk是JRE,JDK包含JRE和开发工具(javadoc(生成 API 文档)、jdb(调试器)、javap(反编译器)等)。

下载完成后,使用以下命令切换默认JDK版本

sudo alternatives --config java

会得到类似下面的输出:

共有 1 个提供“java”的程序。

  选项    命令
-----------------------------------------------
*+ 1           /usr/lib/jvm/java-21-openjdk/bin/java

按 Enter 保留当前选项[+],或者键入选项编号:

输入编号切换即可

下载JDK安装包自行安装

注意,下面的所有路径都要替换为自己系统中的实际路径

首先到Oracle官网下载想要安装的版本,怎么找到下载页面就不说了,直接贴个Java归档页面链接,自行选择需要的版本。

可以选择下载 rpm包使用 dnf安装,会自动配置环境,官方没有提供 deb包,正巧我不怎么用 Debian系的发行版

sudo dnf install /path/to/java.rpm -y

但是我下载的是 tar.gz格式的归档文件,最早学Linux的时候是用的这个,习惯了。

首先查看当前系统已安装的 OpenJDK版本,执行命令:

rpm -qa | grep java

得到类似下面的输出:

tzdata-java-2025b-1.fc42.noarch
javapackages-filesystem-6.4.0-5.fc42.noarch
javascriptcoregtk4.1-2.48.3-1.fc42.x86_64
javascriptcoregtk6.0-2.48.3-1.fc42.x86_64
java-21-openjdk-headless-21.0.7.0.6-2.fc42.x86_64

可以看出目前系统安装的是 OpenJDK21.0.7,卸载当前的 OpenJDK

sudo rpm -e --nodeps java-21-openjdk-headless-21.0.7.0.6-2.fc42.x86_64

然后将归档文件下载下来,然后执行以下命令解压至你常用的安装软件的目录,我一般放在 /opt/dev目录下。

## 创建目录
sudo mkdir /opt/dev
## 解压文件
sudo tar -xvf ~/下载/Motrix/jdk-8u441-linux-x64.tar.gz -C /opt/dev

解压完成后,配置环境变量,依次执行以下命令:

echo 'export JAVA_HOME=/opt/dev/jdk1.8.0_441' >> /etc/profile
## Fedora 42中profile中已经有export PATH语句,重复export可能会导致系统已有环境变量实效,可以先看一下文件或者直接编辑文件
echo 'PATH=$PATH:$JAVA_HOME/bin' >> /etc/profile
source /etc/profile

验证

安装完成后,执行 java -version即可看到JDK版本已经更换为我们安装的版本


使用dnf这样的软件包管理工具安装的优点在于不用自己下载安装包,安装和环境配置都会自动完成,而且可以很方便的在不同版本之间切换,缺点是想要安装比较就的版本可能不太容易。

手动安装的优点在于可以安装任意版本的JDK,缺点是可能需要自己配置环境