Skip to content

编译 JDK 20

从源码编译JDK 20,源码下载链接:https://jdk.java.net/

环境

本文版本推荐版本
系统CentOS Linux release 7.9.2009 (Core)
gcc11.2.05.0+
g++11.2.05.0+

需安装一些依赖包:

bash
yum install fontconfig-devel cups-devel alsa-lib-devel unzip zip autoconf libXtst-devel libXt-devel libXrender-devel libXrandr-devel libXi-devel

需安装JDK 19,官方称之为bootstrap JDK,可以理解。安装好之后可以使用java --version检查是否安装成功。

下载好源码openjdk-20+36_src.zip并解压,进入源码根目录/root/openjdk

编译

在源码根目录执行sh configure来检查系统环境:

bash
[root@centos-jdk-compile openjdk]$ sh configure
# ......
====================================================
A new configuration has been successfully created in
/root/openjdk/build/linux-x86_64-server-release
using default settings.

Configuration summary:
* Name:           linux-x86_64-server-release
* Debug level:    release
* HS debug level: product
* JVM variants:   server
* JVM features:   server: 'cds compiler1 compiler2 epsilongc g1gc jfr jni-check jvmci jvmti management parallelgc serialgc services shenandoahgc vm-structs zgc' 
* OpenJDK target: OS: linux, CPU architecture: x86, address length: 64
* Version string: 20-internal-adhoc.root.openjdk (20-internal)
* Source date:    1689909559 (2023-07-21T03:19:19Z)

Tools summary:
* Boot JDK:       openjdk version "19.0.2" 2023-01-17 OpenJDK Runtime Environment (build 19.0.2+7-44) OpenJDK 64-Bit Server VM (build 19.0.2+7-44, mixed mode, sharing) (at /usr/lib/jdk/jdk-19.0.2)
* Toolchain:      gcc (GNU Compiler Collection)
* C Compiler:     Version 11.2.0 (at /usr/local/bin/gcc)
* C++ Compiler:   Version 11.2.0 (at /usr/local/bin/g++)

Build performance summary:
* Build jobs:     1
* Memory limit:   1833 MB

执行make all来进行全量编译:

bash
[root@centos-jdk-compile openjdk]$ make all
# ......
Creating support/test/hotspot/jtreg/native/bin/daemonDestroy from 1 file(s)
Creating support/test/hotspot/jtreg/native/bin/sigtest from 1 file(s)
Generating JDK_API javadoc for 60 modules
Generating JAVASE_API javadoc for 21 modules
Generating REFERENCE_API javadoc for 21 modules
Finished building target 'all' in configuration 'linux-x86_64-server-release'

编译完成后,在openjdk/build/下有一个目录linux-x86_64-server-release\,所有的编译成果均位于其中。

目录结构如下:

bash
[root@centos-jdk-compile linux-x86_64-server-release]$ tree -L 1
.
├── bootcycle-spec.gmk  包含一些用于编译引导 JDK 的特定规则。
├── buildjdk-spec.gmk   包含一些用于编译 JDK 的特定规则。
├── build.log           编译过程的日志文件,记录了编译过程中的输出和错误信息。
├── buildtools          编译所需的工具脚本和支持文件。
├── compare.sh          用于比较编译后的 JDK 和原始 JDK 源代码之间的差异的脚本。
├── configure.log       配置过程的日志文件,记录了配置过程中的输出和错误信息。
├── configure-support   配置所需的支持文件。
├── hotspot             HotSpot 虚拟机的源代码,HotSpot OpenJDK 中的默认 JVM 实现。
├── images              JDK 编译后的安装目录。其中,images/jdk 目录包含了完整的 JDK 文件结构,可以直接使用。
├── jdk                 JDK 源代码的根目录,包含了 JDK 的各个模块和子项目。
├── Makefile            用于调用 GNU Make 工具,执行编译过程。
├── make-support        编译过程中 Make 工具所需的支持文件。
├── spec.gmk            包含一些通用的 JDK 编译规则和设置。
└── support             其他编译和支持文件。

重点是images/jdkjdk这两个目录:

  • jdk 目录: 这个目录包含了 JDK 编译生成的各种类文件、JAR 文件、本地库文件等内容,以及 JDK 的头文件和静态库文件。这些文件都是 JDK 编译的中间结果,是构建 JDK 的一部分,但并不是最终用户需要的 JDK 安装包。
  • images/jdk 目录: 这个目录包含了最终用户需要的 JDK 安装包内容。在完成 JDK 编译后,构建系统会将编译生成的类文件、JAR 文件等打包为一个完整的 JDK 安装包,位于 images/jdk 目录中。这个目录里的内容是一个可直接安装和使用的 JDK,可以将其拷贝到指定位置,即可在系统中使用 JDK。

查看一下编译出来的java版本:

bash
[root@centos-jdk-compile openjdk] $ ./build/linux-x86_64-server-release/images/jdk/bin/java --version
openjdk 20-internal 2023-03-21
OpenJDK Runtime Environment (build 20-internal-adhoc.root.openjdk)
OpenJDK 64-Bit Server VM (build 20-internal-adhoc.root.openjdk, mixed mode)

JDK和JRE的区别

都知道JRE是 Java Runtime Environment,JDK是Java Development Kit,那么他们到底有什么区别,可以看这个图:

image-20230721140751613