在 RHEL 上安装并使用红帽构建的 OpenJDK 11

Red Hat build of OpenJDK 11

Red Hat Customer Content Services

摘要

Red Hat build of OpenJDK 是 Red Hat Enterprise Linux 平台上的红帽产品。安装和使用红帽构建的 OpenJDK 11 指南概述了此产品,并解释了如何安装软件并开始使用它。

使开源包含更多

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。详情请查看 CTO Chris Wright 的信息

对红帽文档提供反馈

我们感谢您对我们文档的反馈。要提供反馈,您可以突出显示文档中的文本并添加注释。

本节介绍如何提交反馈。

先决条件

  • 已登陆到红帽客户门户网站。
  • 在红帽客户门户中,以多页 HTML 格式查看文档。

流程

要提供反馈,请执行以下步骤:

  1. 点文档右上角的反馈按钮查看现有的反馈。

    注意

    反馈功能仅在多页 HTML 格式中启用。

  2. 高亮标记您要提供反馈的文档中的部分。
  3. 点在高亮文本旁弹出的 Add Feedback

    文本框将在页面右侧的"反馈"部分中打开。

  4. 在文本框中输入您的反馈,然后点 Submit

    创建了一个与文档相关的问题。

  5. 要查看问题,请单击反馈视图中的问题跟踪器链接。

第 1 章 Red Hat build of OpenJDK 11 概述

OpenJDK(Open Java Development Kit)是 Java Platform, Standard Edition (Java SE) 的一个开源实现。红帽构建的 OpenJDK 在三个版本中提供:8u、11u 和 17u。

红帽构建的 OpenJDK 软件包在 Red Hat Enterprise Linux 和 Microsoft Windows 上提供,并作为红帽生态系统目录中的 JDK 和 JRE 提供。

第 2 章 在 Red Hat Enterprise Linux 上安装红帽构建的 OpenJDK 11

OpenJDK 是用于开发和运行各种平台相关应用程序的环境,从移动应用程序到桌面和 Web 应用程序和企业系统。红帽提供了 Java Platform SE (标准版)的开源实现,称为红帽构建的 OpenJDK。

应用程序使用 JDK (Java Development Kit)开发。应用程序在 JVM (Java 虚拟机)上运行,该虚拟机包含在 JRE (Java Runtime Environment)和 JDK 中。还有一个无头版本的 Java,其占用空间最小,不包括用户界面所需的库。无头版本打包在无头子软件包中。

注意

如果您不确定是否需要 JRE 或 JDK,建议您安装 JDK。

以下小节提供了在 Red Hat Enterprise Linux 上安装红帽构建的 OpenJDK 的说明。

注意

您可以在本地系统中安装 Red Hat build of OpenJDK 的多个主版本。如果您需要从一个主版本切换到另一个主版本,请在命令行界面(CLI)中运行以下命令,然后按照屏幕提示操作:

$ sudo update-alternatives --config 'java'

2.1. 使用 yum 在 RHEL 上安装 JRE

您可以使用系统软件包管理器 yum 安装红帽构建的 OpenJDK Java Runtime Environment (JRE)。

先决条件

流程

  1. 运行 yum 命令,指定您要安装的软件包:

    $ sudo yum install java-11-openjdk
  2. 检查安装是否正常工作:

    $ java -version
    
    openjdk version "11.0.14" 2022-01-18 LTS LTS
    OpenJDK Runtime Environment 18.9 (build 11.0.14+9-LTS)
    OpenJDK 64-Bit Server VM 18.9 (build 11.0.14+9-LTS, mixed mode, sharing)
    注意

    如果上一命令的输出显示您系统上签出了不同的 OpenJDK 主版本,您可以在 CLI 中输入以下命令来将您的系统切换为使用 Red Hat build of OpenJDK 11:

    $ sudo update-alternatives --config 'java'

2.2. 使用存档在 RHEL 上安装 JRE

您可以使用存档安装红帽构建的 OpenJDK Java Runtime Environment (JRE)。如果 Java 管理员没有 root 特权,这非常有用。

注意

为便于升级,请创建一个父目录,使其包含您的 JRE,并使用通用路径创建指向最新 JRE 的符号链接。

流程

  1. 创建一个目录,您要下载存档文件,然后导航到命令行界面(CLI)上的该目录。例如:

    $ mkdir ~/jres
    
    $ cd ~/jres
  2. 导航到红帽客户门户网站中的 Software Downloads 页面。
  3. Version 下拉列表中选择最新版本的 OpenJDK 11,然后将 Linux 的 JRE 归档下载到本地系统。
  4. 将存档的内容提取到您选择的目录中:

    $ tar -xf java-11-openjdk-11.0.14.0.9-3.portable.jre.el.x86_64.tar.xz -C ~/jres
  5. 使用指向 JRE 的符号链接创建通用路径,以便更轻松地升级:

    $ ln -s ~/jres/java-11-openjdk-11.0.14.0.9-3.portable.jre.el.x86_64 ~/jres/java-11
  6. 配置 JAVA_HOME 环境变量:

    $ export JAVA_HOME=~/jres/java-11
  7. 验证 JAVA_HOME 环境变量是否已正确设置:

    $ printenv | grep JAVA_HOME
    
    JAVA_HOME=~/jres/java-11
    注意

    使用此方法安装时,Java 仅适用于当前用户。

  8. 将通用 JRE 路径的 bin 目录添加到 PATH 环境变量中:

    $ export PATH="$JAVA_HOME/bin:$PATH"
  9. 验证 java -version 是否在没有提供完整路径的情况下工作:

    $ java -version
    
    openjdk version "11.0.14" 2022-01-18 LTS
    OpenJDK Runtime Environment 18.9 (build 11.0.14+9-LTS)
    OpenJDK 64-Bit Server VM 18.9 (build 11.0.14+9-LTS, mixed mode, sharing)
    注意

    您可以通过在 ~/.bashrc 中导出环境变量来确保 JAVA_HOME 环境变量为当前用户保留。

2.3. 使用 yum 在 RHEL 上安装红帽构建的 OpenJDK

您可以使用系统软件包管理器 yum 安装红帽构建的 OpenJDK。

先决条件

流程

  1. 运行 yum 命令,指定您要安装的软件包:

    $ sudo yum install java-11-openjdk-devel
  2. 检查安装是否正常工作:

    $ javac -version
    
    javac 11.0.14

2.4. 使用存档在 RHEL 上安装红帽构建的 OpenJDK

您可以使用存档安装红帽构建的 OpenJDK。如果 Java 管理员没有 root 特权,这非常有用。

注意

为简化升级,创建一个包含您的 JRE 的父目录,并使用通用路径创建指向最新 JRE 的符号链接。

流程

  1. 创建一个目录,您要下载存档文件,然后导航到命令行界面(CLI)上的该目录。例如:

    $ mkdir ~/jdks
    
    $ cd ~/jdks
  2. 导航到红帽客户门户网站中的 Software Downloads 页面。
  3. Version 下拉列表中选择最新版本的 OpenJDK 11,然后将 Linux 的 JDK 存档下载到本地系统。
  4. 将存档的内容提取到您选择的目录中:

    $ tar -xf java-11-openjdk-11.0.14.0.9-3.portable.jdk.el.x86_64.tar.xz -C ~/jdks
  5. 使用到 JDK 的符号链接创建通用路径,以便更轻松地升级:

    $ ln -s ~/jdks/java-11-openjdk-11.0.14.0.9-3.portable.jdk.el.x86_64 ~/jdks/java-11
  6. 配置 JAVA_HOME 环境变量:

    $ export JAVA_HOME=~/jdks/java-11
  7. 验证 JAVA_HOME 环境变量是否已正确设置:

    $ printenv | grep JAVA_HOME
    
    JAVA_HOME=~/jdks/java-11
    注意

    使用此方法安装时,Java 仅适用于当前用户。

  8. 将通用 JRE 路径的 bin 目录添加到 PATH 环境变量中:

    $ export PATH="$JAVA_HOME/bin:$PATH"
  9. 验证 java -version 是否在没有提供完整路径的情况下工作:

    $ java -version
    
    openjdk version "11.0.14" 2022-01-18 LTS
    OpenJDK Runtime Environment 18.9 (build 11.0.14+9-LTS)
    OpenJDK 64-Bit Server VM 18.9 (build 11.0.14+9-LTS, mixed mode, sharing)
    注意

    您可以通过在 ~/.bashrc 中导出环境变量来确保 JAVA_HOME 环境变量为当前用户保留。

2.5. 使用 yum 在 RHEL 上安装红帽构建的 OpenJDK 的多个主版本

您可以使用系统软件包管理器 yum 安装多个版本的 OpenJDK。

先决条件

  • 具有有效订阅的 Red Hat Subscription Management (RHSM)帐户,可访问提供您要安装的 OpenJDK 的红帽构建的仓库。
  • 必须具有系统上的 root 权限。

流程

  1. 运行以下 yum 命令以安装软件包:

    对于红帽构建的 OpenJDK 17

    $ sudo yum install java-17-openjdk

    对于红帽构建的 OpenJDK 11

    $ sudo yum install java-11-openjdk

    对于红帽构建的 OpenJDK 8

    $ sudo yum install java-1.8.0-openjdk
  2. 安装后,检查可用的 Java 版本:

    $ sudo yum list installed "java*"
    
    Installed Packages
    
    java-1.8.0-openjdk.x86_64   1:1.8.0.322.b06-2.el8_5    @rhel-8-for-x86_64-appstream-rpms
    java-11-openjdk.x86_64    1:11.0.14.0.9-2.el8_5    @rhel-8-for-x86_64-appstream-rpms
    java-17-openjdk.x86_64    1:17.0.2.0.8-4.el8_5    @rhel-8-for-x86_64-appstream-rpms
  3. 检查当前的 java 版本:

    $ java -version
    
    openjdk version "11.0.14" 2022-01-18 LTS
    OpenJDK Runtime Environment 18.9 (build 11.0.14+9-LTS)
    OpenJDK 64-Bit Server VM 18.9 (build 11.0.14+9-LTS, mixed mode, sharing)
    注意

    如果上一命令的输出显示您系统上签出了不同的 OpenJDK 主版本,您可以在 CLI 中输入以下命令来将您的系统切换为使用 Red Hat build of OpenJDK 11:

    $ sudo update-alternatives --config 'java'

其他资源

2.6. 使用存档在 RHEL 上安装红帽构建的 OpenJDK 的多个主版本

您可以使用在 RHEL 上安装 JRE 的相同步骤,使用存档或在 RHEL 11 上安装红帽构建的 OpenJDK,使用多个主要版本在 RHEL 11 上安装红帽构建的 OpenJDK,从而安装多个主版本的多个主版本

注意

有关如何为系统配置默认红帽 OpenJDK 版本构建的说明,请参阅 在 RHEL 上主动选择系统范围的 OpenJDK 版本

其他资源

2.7. 使用 yum 在 RHEL 上安装多个红帽构建的 OpenJDK 的次版本

您可以在 RHEL 上安装 Red Hat build of OpenJDK 的多个次版本。这可以通过防止安装的次版本被更新。

流程

  1. /etc/yum.conf 中添加 installonlypkgs 选项,以指定 yum 可以安装但不更新的 OpenJDK 软件包的红帽构建。

    $ installonlypkgs=java-<version>--openjdk,java-<version>--openjdk-headless,java-<version>--openjdk-devel

    更新会在系统中保留旧版本时安装新软件包:

    $ rpm -qa | grep java-11-openjdk
    
    java-11-java-11-openjdk-11.0.13.0.8-1.el8_5.x86_64
    java-11-openjdk-11.0.14.0.9-2.el8_5.x86_64
  2. Red Hat build of OpenJDK 的不同次版本可在 /usr/lib/jvm/ <minor version> 文件中找到。

    例如,下面显示了 /usr/lib/jvm/java-11-openjdk 的一部分:

    $ /usr/lib/jvm/java-11-openjdk-11.0.14.0.9-2.el8_5.x86_64/bin/java -version
    
    openjdk version "11.0.14" 2022-01-18 LTS
    OpenJDK Runtime Environment 18.9 (build 11.0.14+9-LTS)
    OpenJDK 64-Bit Server VM 18.9 (build 11.0.14+9-LTS, mixed mode, sharing)
    
    $ /usr/lib/jvm/java-11-java-11-openjdk-11.0.13.0.8-1.el8_5.x86_64/bin/java -version
    
    openjdk version ""11.0.13" 2021-10-19 LTS
    OpenJDK Runtime Environment 18.9 (build 11.0.13+8-LTS)
    OpenJDK 64-Bit Server VM 18.9 (build 11.0.13+8-LTS, mixed mode, sharing)

2.8. 使用存档在 RHEL 上安装 Red Hat build of OpenJDK 的多个次版本

使用一个存档或使用多个次版本的存档在 RHEL 11 上安装红帽构建的 OpenJDK 版本时,安装多个次版本与在 RHEL 11 上安装 JRE 的过程相同。

注意

有关如何为系统选择默认次版本的说明,请参阅 在 RHEL 上非交互选择系统范围的 Red Hat build of OpenJDK 版本

其他资源

第 3 章 红帽构建的 OpenJDK 11 的调试符号

调试符号有助于调查红帽构建的 OpenJDK 应用程序崩溃。

3.1. 安装调试符号

这个步骤描述了如何为红帽构建的 OpenJDK 安装调试符号。

先决条件

  • 在本地 sytem 上安装了 gdb 软件包。

    • 您可以在 CLI 上发出 sudo yum install gdb 命令,以在本地系统上安装此软件包。

流程

  1. 要安装调试符号,请输入以下命令:

    $ sudo debuginfo-install java-11-openjdk
    
    $ sudo debuginfo-install java-11-openjdk-headless

    这些命令安装 java-11-openjdk-debuginfojava-11-openjdk-headless-debuginfo 以及为红帽构建的 OpenJDK 11 二进制文件提供调试符号的额外软件包。这些软件包并不是自我的,不包含 可执行二进制文件。

    注意

    debuginfo-installyum-utils 软件包提供。

  2. 要验证是否安装了 debug 符号,请输入以下命令:

    $ gdb which java
    
    Reading symbols from /usr/bin/java...Reading symbols from /usr/lib/debug/usr/lib/jvm/java-11-openjdk-11.0.14.0.9-2.el8_5/bin/java-11-openjdk-11.0.14.0.9-2.el8_5.x86_64.debug...done.
    
    (gdb)

3.2. 检查调试符号的安装位置

此流程解释了如何查找调试符号的位置。

注意

如果安装了 debuginfo 软件包,但您无法获取软件包的安装位置,请检查是否已安装了正确的软件包和 java 版本。确认版本后,再次检查调试符号的位置。

先决条件

  • 在本地 sytem 上安装了 gdb 软件包。

    • 您可以在 CLI 上发出 sudo yum install gdb 命令,以在本地系统上安装此软件包。
    • 安装了调试符号软件包。请参阅 安装调试符号

流程

  1. 要查找调试符号的位置,请使用 gdbjava 命令:

    $ gdb which java
    
    Reading symbols from /usr/bin/java...Reading symbols from /usr/lib/debug/usr/lib/jvm/java-11-openjdk-11.0.14.0.9-2.el8_5/bin/java-11-openjdk-11.0.14.0.9-2.el8_5.x86_64.debug...done.
    
    (gdb)
  2. 使用以下命令浏览 *-debug 目录来查看库的所有调试版本,其中包括 javajavacjavah

    $ cd /usr/lib/debug/lib/jvm/java-11-openjdk-11.0.14.0.9-2.el8_5
    $ tree
    
    OJDK 11 version:
    └── java-11-openjdk-11.0.14.0.9-2.el8_5
    ├── bin
    │   ...
    │ │──  java-java-11-openjdk-11.0.14.0.9-2.el8_5.x86_64.debug
    │   ├── javac-java-11-openjdk-11.0.14.0.9-2.el8_5.x86_64.debug
    │   ├── javadoc-java-11-openjdk-11.0.14.0.9-2.el8_5.x86_64.debug
    │   ...
    └── lib
    ├── jexec-java-11-openjdk-11.0.14.0.9-2.el8_5.x86_64.debug
    ├── jli
    │   └── libjli.so-java-11-openjdk-11.0.14.0.9-2.el8_5.x86_64.debug
    ├── jspawnhelper-java-11-openjdk-11.0.14.0.9-2.el8_5.x86_64.debug
    │   ...
注意

javacjavah 工具由 java-11-openjdk-devel 软件包提供。您可以使用 命令来安装软件包 :$ sudo debuginfo-install java-11-openjdk-devel

3.3. 检查调试符号的配置

您可以检查和设置调试符号的配置。

  • 输入以下命令获取安装的软件包列表:

    $ sudo yum list installed | grep 'java-11-openjdk-debuginfo'
  • 如果没有安装一些调试信息软件包,请输入以下命令安装缺少的软件包:

    $ sudo yum debuginfo-install glibc-2.28-151.el8.x86_64 libgcc-8.4.1-1.el8.x86_64 libstdc++-8.4.1-1.el8.x86_64 sssd-client-2.4.0-9.el8.x86_64 zlib-1.2.11-17.el8.x86_64
  • 如果要达到特定的断点,请运行以下命令:

    $ gdb -ex 'handle SIGSEGV noprint nostop pass' -ex 'set breakpoint pending on' -ex 'break JavaCalls::call' -ex 'run' --args java ./HelloWorld

    以上命令完成以下任务:

    • 处理 SIGSEGV 错误,因为 JVM 使用 SEGV 进行堆栈溢出检查。
    • 将待处理的断点设置为 yes
    • JavaCalls::call 函数中调用 break 语句。在 HotSpot (libjvm.so)中启动应用程序的功能。

3.4. 在致命错误日志文件中配置调试符号

当 Java 应用因为 JVM 崩溃而停机时,会生成一个致命错误日志文件,例如: hs_error,java_error。这些错误日志文件在应用程序的当前工作目录中生成。crash 文件包含来自堆栈的信息。

流程

  1. 您可以使用 strip -g 命令删除所有调试符号。以下代码显示了一个未经过的 hs_error 文件示例:

    Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
    V  [libjvm.so+0xb83d2a]  Unsafe_SetLong+0xda
    j  sun.misc.Unsafe.putLong(Ljava/lang/Object;JJ)V+0
    j  Crash.main([Ljava/lang/String;)V+8
    v  ~StubRoutines::call_stub
    V  [libjvm.so+0x6c0e65]  JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*)+0xc85
    V  [libjvm.so+0x73cc0d]  jni_invoke_static(JNIEnv_*, JavaValue*, _jobject*, JNICallType, _jmethodID*, JNI_ArgumentPusher*, Thread*) [clone .constprop.1]+0x31d
    V  [libjvm.so+0x73fd16]  jni_CallStaticVoidMethod+0x186
    C  [libjli.so+0x48a2]  JavaMain+0x472
    C  [libpthread.so.0+0x9432]  start_thread+0xe2

    以下代码显示了剥离的 hs_error 文件示例:

    Stack: [0x00007ff7e1a44000,0x00007ff7e1b44000],  sp=0x00007ff7e1b42850,  free space=1018k
    Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
    V  [libjvm.so+0xa7ecab]
    j  sun.misc.Unsafe.putAddress(JJ)V+0
    j  Crash.crash()V+5
    j  Crash.main([Ljava/lang/String;)V+0
    v  ~StubRoutines::call_stub
    V  [libjvm.so+0x67133a]
    V  [libjvm.so+0x682bca]
    V  [libjvm.so+0x6968b6]
    C  [libjli.so+0x3989]
    C  [libpthread.so.0+0x7dd5]  start_thread+0xc5
  2. 输入以下命令检查您是否有相同的调试符号版本和严重错误日志文件:

    $ java -version
    注意

    您还可以使用 sudo update-alternatives --config 'java' 完成此检查。

  3. 使用 nm 命令确保 libjvm.so 具有 ELF 数据和文本符号:

    /usr/lib/debug/usr/lib/jvm/java-11-openjdk-11.0.14.0.9-2.el8_5/lib/server/libjvm.so-11.0.14.0.9-2.el8_5.x86_64.debug

其他资源

第 4 章 在 RHEL 上更新红帽构建的 OpenJDK 11

以下小节提供了在 RHEL 上更新红帽构建的 OpenJDK 11 的说明。

4.1. 使用 yum 更新 RHEL 上的红帽 OpenJDK 11 构建

可使用 yum 系统软件包管理器更新已安装的红帽构建的 OpenJDK 软件包。

先决条件

  • 必须具有系统上的 root 权限。

流程

  1. 检查当前版本的 OpenJDK 版本:

    $ sudo yum list installed "java*"

    此时会显示已安装的红帽构建的 OpenJDK 软件包列表。

    Installed Packages
    
    java-1.8.0-openjdk.x86_64   1:1.8.0.322.b06-2.el8_5    @rhel-8-for-x86_64-appstream-rpms
    java-11-openjdk.x86_64    1:11.0.14.0.9-2.el8_5    @rhel-8-for-x86_64-appstream-rpms
    java-17-openjdk.x86_64    1:17.0.2.0.8-4.el8_5    @rhel-8-for-x86_64-appstream-rpms
  2. 更新特定软件包。例如:

    $ sudo yum update java-11-openjdk
  3. 通过检查当前红帽构建的 OpenJDK 版本来验证更新是否正常工作:

    $ java -version
    
    openjdk version "11.0.14" 2022-01-18 LTS
    OpenJDK Runtime Environment 18.9 (build 11.0.14+9-LTS)
    OpenJDK 64-Bit Server VM 18.9 (build 11.0.14+9-LTS, mixed mode, sharing)
    注意

    如果上一命令的输出显示您系统上签出了不同的 OpenJDK 主版本,您可以在 CLI 中输入以下命令来将您的系统切换为使用 Red Hat build of OpenJDK 11:

    $ sudo update-alternatives --config 'java'

4.2. 使用存档更新 RHEL 上的红帽 OpenJDK 11 构建

您可以使用存档更新红帽构建的 OpenJDK。如果红帽构建的 OpenJDK 管理员没有 root 权限,这很有用。

先决条件

  • 知道指向 JDK 或 JRE 安装的通用路径。例如: ~/jdks/java-11

流程

  1. 删除 JDK 或 JRE 的通用路径的现有符号链接。

    例如:

    $ unlink ~/jdks/java-11
  2. 在安装位置中安装 JDK 或 JRE 的最新版本。

其他资源

更新于 2023-09-20

法律通告

Copyright © 2023 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.