macOS 下编译 openjdk8
本次编译使用的系统是 macOS High Sierra
,版本为 10.13.1
。使用的 jdk 是 Oracle JDK
,版本为 1.7.0_79
。
1 | java version "1.7.0_79" |
说明
openjdk 的模块,部分使用 C/C++ 编写实现,部分使用 Java 实现。因此除了需要 C/C++ 相关编译工具外,还需要有一个 JDK (Bootstrap JDK)。编译 openjdk8
时可使用 jdk1.7
作为 Bootstrap JDK。
openjdk8u 官方地址:http://openjdk.java.net/projects/jdk8u/
准备工作
下载源码
官方的 openjdk 源码没有针对新的系统和编译工具链做处理,在编译的过程中遇到一堆问题,只能一个一个地去解决,需要花费很多时间。
在解决报错问题的时候发现 JetBrains 提供了一套 openjdk 源码
Usually, we do not modify any of the repositories except jdk module. Other repositories are needed for build purposes.
查看说明发现对 jdk 模块有修改,不过不影响研究。下载下来按说明编译,很快就可以编译成功,看来是解决了新环境下的报错问题。
1 | git clone https://github.com/JetBrains/jdk8u.git |
代码比较多,如果你下载比较慢,也可以从镜像下载
1 | git clone https://gitee.com/gorden5566/jdk8u.git |
目录结构
openjdk8 的目录结构如下,可对比检查下是否有遗漏模块
1 | ├── ASSEMBLY_EXCEPTION |
安装依赖
FreeType
这里使用的是方法一
方法一
直接通过 brew 安装 FreeType
1 | brew install freetype |
执行 configure 时使用如下参数
1 | --with-freetype=/usr/local --with-freetype-include=/usr/local/include/freetype2 |
方法二
下载并安装 XQuartz
执行 configure 时使用如下参数
1 | --with-freetype=/opt/X11/lib --with-freetype-include=/usr/X11/include/freetype2 |
补充: linux 环境下配置
安装 libfreetype6-dev
1 | sudo apt install libfreetype6-dev |
查看安装路径
1 | dpkg -L libfreetype6-dev |
注意这两行输出的路径
1 | /usr/include/freetype2/ft2build.h |
可以得到我们需要的参数
1 | --with-freetype-include=/usr/include/freetype2/ |
Command Line Tools
执行命令安装
1 | xcode-select --install |
XCode
直接从 APP Store 安装最新版本的 XCode
注:经测试不安装也可以编译 release 版本的 jdk
编译 openjdk8
执行 configure
1 | export MACOSX_DEPLOYMENT_TARGET=10.8 |
注:注意 freetype 的路径
输出结果如下 (具体路径可能会不同),已经在 build
目录下生成了 release
版本的相关配置文件
1 | A new configuration has been successfully created in |
编译
如果使用的是 Xcode 4.6.3 版本,可直接输入 make all
编译。使用更高的版本需指定 COMPILER_WARNINGS_FATAL=false
1 | make all COMPILER_WARNINGS_FATAL=false |
如果已经通过 configure 生成了多个配置 (build 目录下有多个文件夹),则会出现如下提示
1 | Available configurations: |
可通过 CONF=<config pattern>
指定要编译的版本,例如编译 release
版本
1 | make all COMPILER_WARNINGS_FATAL=false CONF=release |
自动匹配到对应的配置
1 | Building 'macosx-x86_64-normal-server-release' (matching CONF=release) |
编译完会输出各个模块的耗时,第一次编译耗时会比较长。如果中间有报错,修改后再次执行会跳过已编译好的模块。
1 | ----- Build times ------- |
检查 java 版本
编译生成的结果保存在 build 目录下,release 版本的目录为 macosx-x86_64-normal-server-release
,目录结构如下
1 | ├── Makefile |
切换到 ./jdk/bin/
目录下,执行命令查看 java
版本
1 | ./java -version |
测试一下
新建一个 HelloWorld.java
的测试文件
1 | public class HelloWorld { |
编译并执行
1 | ./javac HelloWorld.java |
结果显示正常
1 | Hello World |
编译参数
默认情况下编译的是 release 版本的 jdk,可通过参数指定编译为 fastdebug 或 slowdebug 版本
编译 fastdebug 版本
- 执行 configure 时带上
--with-debug-level=fastdebug
参数 - 执行 make 时指定选择
fastdebug
配置,需加上CONF=fastdebug
参数
编译 slowdebug 版本
- 执行 configure 时带上
--with-debug-level=slowdebug
参数 - 执行 make 时指定选择
slowdebug
配置,需加上CONF=slowdebug
参数
编译选项
执行 make help
查看可用的选项。如 make images
表示只编译 images
部分
1 | OpenJDK Makefile help |
参考
周志明. 深入理解Java虚拟机
- 2021-04-08
最近遇到了一次诡异的
NoSuchMethodError
错误,通常情况下遇到这个报错,大概率是类加载冲突导致的,然而这次的情况却不大一样。 - 2021-01-30
Mac 下编译 netty 报错,提示
Netty/Transport/Native/Unix/Common
模块编译失败,到网上搜索一下,并未发现有人遇到过类似问题,因此做下记录。 - 2020-12-04
Rpc Agent is a framework, with which you can develop an agent server for a RPC framework.