编译 JDK 20
从源码编译JDK 20,源码下载链接:https://jdk.java.net/
环境
项 | 本文版本 | 推荐版本 |
---|---|---|
系统 | CentOS Linux release 7.9.2009 (Core) | |
gcc | 11.2.0 | 5.0+ |
g++ | 11.2.0 | 5.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/jdk
和jdk
这两个目录:
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,那么他们到底有什么区别,可以看这个图: