学习《深入理解Java虚拟机》第三版过程中,记录在MacOS环境编译OpenJDK12的过程。
1.下载OpenJDK源码
访问https://hg.openjdk.java.net/jdk/jdk12/,然后点击左边菜单中的Browse,下载zip包

ps:该过程中一直遇到下载失败的问题,通过配置谷歌的多线程下载解决:
- 访问chrome://flags/
2.在搜索框中输入 Parallel downloading,选择enabled,重启浏览器
2. Bootstrap JDK
假设要编译大版本号为N的JDK,我们还要另外准备一个大版本号至少为N-1的、已经编译好的JDK,这是因为OpenJDK由多个部分(HotSpot、JDK类库、JAXWS、JAXP……)构成,其中一部分(HotSpot)代码使用C、C++编写,而更多的代码则是使用Java语言来实现,因此编译这些Java代码就需要用到另一个编译期可用的JDK,官方称这个JDK为“Bootstrap JDK”。编译OpenJDK 12时,Bootstrap JDK必须使用JDK 11及之后的版本。
3. 使用homebrew安装依赖
1 | brew install ccache //加速编译 |
4.自动检测依赖
以下命令均在openjdk12路径下执行
1 | bash ./configure |
报错如下

解决方法
1 | brew install autoconf |
1 | 继续执行 |
报错如下

解决方法
1 | sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer |
1 | 继续执行 |
成功,可以看到生成了build路径

5.开始编译
依赖检查通过后便可以输入“make images”执行整个OpenJDK编译,这里“images”是“product-images”编译目标(Target)的简写别名,这个目标的作用是编译出整个JDK镜像
1 | make images |

解决方法:将本地的jdk8替换为jdk11
继续 make images,会遇到几个JDK 12的源码里的bug,分别记录如下:
1.src/hotspot/share/runtime/arguments.cpp 1452

1 | // 找到jdk12-06222165c35f/src/hotspot/share/runtime/arguments.cpp1452行,将 |
2.test/hotspot/gtest/classfile/test_symbolTable.cpp 62

1 | //找到jdk12-06222165c35f/test/hotspot/gtest/classfile/test_symbolTable.cpp的62行,将 |
3.src/hotspot/share/runtime/sharedRuntime.cpp 2873

1 | //找到/Users/anluyao/workspace/openjdk/jdk12-06222165c35f/src/hotspot/share/runtime/sharedRuntime.cpp的2873行,将 |
4.src/java.desktop/macosx/native/libawt_lwawt/awt/CSystemColors.m 134

1 | // 找到/Users/anluyao/workspace/openjdk/jdk12-06222165c35f/src/java.desktop/macosx/native/libawt_lwawt/awt/CSystemColors.m的134行,将 |
以上bug fix之后继续执行make images ,成功
ps:大概7分钟,期间电脑持续90℃+

1 | ~/workspace/openjdk/jdk12-06222165c35f/build/macosx-x86_64-server-release/jdk/bin ./java -version |
至此,OpenJDK12已编译完成。
