一、系统环境 操作系统: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 的获取方式,你可以从版本管理中看到代码提交的记录和日志,能更加精确地了解 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.sh
为 build/.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)