一、系统环境

操作系统:macOS 10.15.4(Catalina)

处理器:2.6 GHz 双核Intel Core i5

内存:8G

硬盘:512G

NOTE: 在 macOS 平台编译 OpenJDK 14,操作系统版本官方建议至少使用 Mac OS X 10.13(High Sierra),可用磁盘空间建议至少 6 GB。

二、准备工作

2.1 Boot JDK

矛盾的是,为了编译 OpenJDK,我们需要预先安装一个版本的 JDK,官方称这个 JDK 为 Boot JDK,即引导 JDK。

何为 Boot JDK

我们知道,OpenJDK 源码由多个部分组成,包括 HotSpot、JDK 类库、JAXP 等。其中一部分的代码是使用 C/C++ 编写的,如 HotSpot;而更多的代码其实是使用 Java 实现的,如我们熟知的 JDK 类库。编译这些 Java 代码就需要用到另一个已经编译的 JDK,官方称这个 JDK 为 Bootstrap JDK,即引导 JDK,作用是编译 OpenJDK 源码中 Java 代码。

如何选择 Boot JDK 的版本

Bootstrap JDK 的版本与我们要编译的 OpenJDK 版本有关。假设要编译的 OpenJDK 的大版本号为 N,那么 Bootstrap JDK 大版本号最小为 N-1 版本。

如本文要编译的 OpenJDK 的大版本号为 14,那 Bootstrap JDK 的大版本号就需要 13 或 13 之后的版本。这里选择的大版本号是 13 :

1
2
3
4
➜  ~ java -version
openjdk version "13.0.2" 2020-01-14
OpenJDK Runtime Environment (build 13.0.2+8)
OpenJDK 64-Bit Server VM (build 13.0.2+8, mixed mode, sharing)

2.2 安装 Xcode

直接通过电脑的 App Store 安装最新版 Xcode 即可。

为什么需要安装 Xcode?这是因为 Xcode 提供了编译 OpenJDK 所需要 CLang 编译器以及 Makefile 中用到的其他外部命令。

2.3 获取源码

从 OpenJDK 官网获取源码有以下两种方式:

  • 一种是通过代码管理工具 Mercurial 从 Repository(http://hg.openjdk.java.net/jdk/jdk14/) 中取得源码:

    1
    hg clone http://hg.openjdk.java.net/jdk/jdk14/
  • 另一种是先在仓库中打包出源码压缩包,再下载压缩包,主要步骤如下:

    1. 在浏览器打开链接 http://hg.openjdk.java.net/jdk/jdk14/

      image-20200511232123290

    2. 点击左侧菜单栏 browse 链接:

      image-20200511232253789

    3. 然后再点击左侧菜单栏 zip 链接,即可进行下载。

通过代码管理工具 Mercurial 的获取方式,你可以从版本管理中看到代码提交的记录和日志,能更加精确地了解 Java 代码发生的变化。此种方式的缺点是 clone 的速度很慢,虽然代码总大小只有几百MB,但小文件数量众多,而且该代码仓库在国内没有 CDN 节点,经常在 clone 的过程中出现中断的情况。

通过从官网下载压缩包的获取方式,在国内同样也会有网络慢的问题。在网络不稳定的情况下,会出现只能下载到 1.5M 左右的残缺包。

所以,如果想从官网获取源码,建议科学上网。

对于不具备科学上网条件的用户,可以去 github 上的镜像库(https://github.com/unofficial-openjdk/openjdk/releases)下载相应的 release 版本。

本文的编译示例采用的是 jdk-14+36 版本,源码包大小为 185.2MB,解压缩之后为 763.6MB。

开始编译

在准备工作完成后,就可以编译 OpenJDK 了。

首先,将下载下来的源码解压到指定文件目录。本示例的目录是 ~/src/openjdk-jdk-14-36。解压后的文件目录如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
➜  ~ cd ~/src/openjdk-jdk-14-36 
➜ openjdk-jdk-14-36 ll
total 80
-rw-rw-r--@ 1 bobotang staff 2.1K 2 7 02:10 ADDITIONAL_LICENSE_INFO
-rw-rw-r--@ 1 bobotang staff 1.5K 2 7 02:10 ASSEMBLY_EXCEPTION
-rw-rw-r--@ 1 bobotang staff 19K 2 7 02:10 LICENSE
-rw-rw-r--@ 1 bobotang staff 2.7K 2 7 02:10 Makefile
-rw-rw-r--@ 1 bobotang staff 341B 2 7 02:10 README
drwxrwxr-x@ 9 bobotang staff 288B 2 7 02:10 bin
-rw-rw-r--@ 1 bobotang staff 1.6K 2 7 02:10 configure
drwxrwxr-x@ 9 bobotang staff 288B 2 7 02:10 doc
drwxrwxr-x@ 69 bobotang staff 2.2K 2 7 02:10 make
drwxrwxr-x@ 81 bobotang staff 2.5K 5 7 23:43 src
drwxrwxr-x@ 14 bobotang staff 448B 2 7 02:10 test

NOTE:目录不要包含中文字符或空格等其他特殊字符

接下来,需要为源码目录下的一些配置文件赋予可执行权限。

执行命令 chmod +x ./configure,为 configure 文件赋予可执行权限:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
➜  openjdk-jdk-14-36 chmod +x ./configure                             
➜ openjdk-jdk-14-36 ll
total 80
-rw-rw-r--@ 1 bobotang staff 2.1K 2 7 02:10 ADDITIONAL_LICENSE_INFO
-rw-rw-r--@ 1 bobotang staff 1.5K 2 7 02:10 ASSEMBLY_EXCEPTION
-rw-rw-r--@ 1 bobotang staff 19K 2 7 02:10 LICENSE
-rw-rw-r--@ 1 bobotang staff 2.7K 2 7 02:10 Makefile
-rw-rw-r--@ 1 bobotang staff 341B 2 7 02:10 README
drwxrwxr-x@ 9 bobotang staff 288B 2 7 02:10 bin
-rwxrwxr-x@ 1 bobotang staff 1.6K 2 7 02:10 configure
drwxrwxr-x@ 9 bobotang staff 288B 2 7 02:10 doc
drwxrwxr-x@ 69 bobotang staff 2.2K 2 7 02:10 make
drwxrwxr-x@ 81 bobotang staff 2.5K 5 7 23:43 src
drwxrwxr-x@ 14 bobotang staff 448B 2 7 02:10 test

执行命令 chmod +x build/.configure-support/generated-configure.shbuild/.configure-support/generated-configure.sh 脚本文件赋予可执行权限:

1
2
3
4
➜  openjdk-jdk-14-36 sudo chmod +x build/.configure-support/generated-configure.sh
➜ openjdk-jdk-14-36 ll build/.configure-support/
total 6272
-rwxr-xr-x 1 root staff 3.0M 5 8 09:41 generated-configure.sh

配置好可执行权限后,执行以下语句进行编译检测:

1
➜  openjdk-jdk-14-36 ./configure --enable-debug --with-jvm-variants=server 

如果检测通过,你可以看到以下输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
A new configuration has been successfully created in
/Users/bobotang/src/openjdk-jdk-14-36/build/macosx-x86_64-server-fastdebug
using configure arguments '--enable-debug --with-jvm-variants=server'.

Configuration summary:
* Debug level: fastdebug
* HS debug level: fastdebug
* JVM variants: server
* JVM features: server: 'aot cds compiler1 compiler2 dtrace epsilongc g1gc graal jfr jni-check jvmci jvmti management nmt parallelgc serialgc services shenandoahgc vm-structs zgc'
* OpenJDK target: OS: macosx, CPU architecture: x86, address length: 64
* Version string: 14-internal+0-adhoc.root.openjdk-jdk-14-36 (14-internal)

Tools summary:
* Boot JDK: openjdk version "14" 2020-03-17 OpenJDK Runtime Environment (build 14+36-1461) OpenJDK 64-Bit Server VM (build 14+36-1461, mixed mode, sharing) (at /Library/Java/JavaVirtualMachines/jdk-14.jdk/Contents/Home)
* Toolchain: clang (clang/LLVM from Xcode 11.4.1)
* C Compiler: Version 11.0.3 (at /usr/bin/clang)
* C++ Compiler: Version 11.0.3 (at /usr/bin/clang++)

Build performance summary:
* Cores to use: 4
* Memory limit: 8192 MB

编译检查通过后,就可以通过命令 make images 生成 OpenJDK 了。

1
➜  openjdk-jdk-14-36 sudo make images

如果你看到以下输出,就说明构建成功了:

1
2
3
4
Creating jdk image
WARNING: Using incubator modules: jdk.incubator.jpackage, jdk.incubator.foreign
Creating CDS archive for jdk image
Finished building target 'images' in configuration 'macosx-x86_64-server-fastdebug'

你可以查看 build 目录下生成的文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
➜  openjdk-jdk-14-36 ll build/macosx-x86_64-server-fastdebug
total 216
-rw-r--r-- 1 root staff 1.3K 5 8 10:10 Makefile
-rw-r--r-- 1 root staff 2.9K 5 8 10:10 bootcycle-spec.gmk
-rw-r--r-- 1 root staff 18K 5 8 10:49 build.log
-rw-r--r-- 1 root staff 8.7K 5 8 10:10 buildjdk-spec.gmk
drwxr-xr-x 46 root staff 1.4K 5 8 10:44 buildtools
-rwxr-xr-x 1 root staff 3.8K 5 8 10:10 compare.sh
drwxr-xr-x 5 root staff 160B 5 8 10:10 configure-support
-rw-r--r-- 1 root staff 21K 5 8 10:10 configure.log
drwxr-xr-x 3 root staff 96B 5 8 10:17 hotspot
drwxr-xr-x 7 root staff 224B 5 8 10:47 images
drwxr-xr-x 12 root staff 384B 5 8 10:43 jdk
drwxr-xr-x 10 root staff 320B 5 8 10:16 make-support
-rw-r--r-- 1 root staff 36K 5 8 10:10 spec.gmk
drwxr-xr-x 27 root staff 864B 5 8 10:44 support

执行 java -version 查看编译后的 OpenJDK 版本:

1
2
3
4
➜  openjdk-jdk-14-36 build/macosx-x86_64-server-fastdebug/jdk/bin/java -version 
openjdk version "14-internal" 2020-03-17
OpenJDK Runtime Environment (fastdebug build 14-internal+0-adhoc.root.openjdk-jdk-14-36)
OpenJDK 64-Bit Server VM (fastdebug build 14-internal+0-adhoc.root.openjdk-jdk-14-36, mixed mode)

至此,OpenJDK 已经成功编译。

(END)