OpenJDK是与Oracle JDK最接近的开源jdk,周志明老师在《深入理解JAVA虚拟机》第一章就建议大家自己编译下OpenJDK的源码,最近遇到JVM相关的一些问题,又心血来潮的想试试。
如果是第一次编译的话真的是很难一次成功的,由于操作系统、软件环境、OpenJDK版本不同各种千奇百怪的问题都有。虽然项目中用的是java8,但因为自己使用macOS 10.13.6操作系统,看了下网上的一些文章对jdk8编译支持不是很好,因此选择了不少人编译成功的jdk9进行下手。
但是jdk9到我这里也行不通,遇到的问题在openjdk官网和stackoverflow上都有人反映,但没人回答, 因此不得不放弃。接下来试jdk9u遇到相同错误,换到jdk10却异常顺利,无需像jdk9一样改源码啥的,一次成功。因此如果你打算在mac上尝试编译的话,建议直接编译jdk10吧。
1. 工具准备
homebrew,mac下的包管理工具
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
mercurial, openjdk源码版本管理工具
sudo easy_install mercurial
ccache, freetype, 编译以及加速编译时所要用到的
brew install ccache
brew install freetype
2. 下载源码
hg clone
hg clone http://hg.openjdk.java.net/jdk10/jdk10/
修改get_source.sh最后几行如下以防止中断
# Get clones of all absent nested repositories (harmless if already exist)
sh ./common/bin/hgforest.sh clone "$@"
while [ $? -ne 0 ]
do
sh ./common/bin/hgforest.sh clone "$@"
done
# Update all existing repositories to the latest sources
sh ./common/bin/hgforest.sh pull -u
while [ $? -ne 0 ]
do
sh ./common/bin/hgforest.sh pull -u
done
执行以下命令以获取全部资源:
sh ./get_source.sh
3. 执行configure
`sh ./configure --with-target-bits=64 --with-freetype=/usr/local/Cellar/freetype/2.9.1 --enable-ccache --with-jvm-variants=server,client --with-boot-jdk-jvmargs="-Xlint:deprecation -Xlint:unchecked" --disable-zip-debug-info --disable-warnings-as-errors --with-debug-level=slowdebug 2>&1 | tee configure_mac_x64.log`
注意:freetype版本要和自己使用的对应
4. 执行make
export LANG=C
make all LOG=debug 2>&1 | tee make_mac_x64.log
5. 验证
执行./java -version打印如下表示编译成功。
openjdk version "10-internal"
OpenJDK Runtime Environment (slowdebug build 10-internal+0-adhoc.baohuahe.jdk10)
OpenJDK 64-Bit Server VM (slowdebug build 10-internal+0-adhoc.baohuahe.jdk10, mixed mode)
接下来就可以愉快的看jvm源码和进行本地调试了。