自己动手在Ubuntu下编译OpenJDK9

最近java 9已经出来了,有很多值得期待的加强。我本来打算直接下个jdk试试,后来看见知乎上有dalao发了篇《Ubuntu下编译OpenJDK9》,于是按着上面的步骤自己编译了jdk。这次的学习有很多收获,我把个人心得分享一下。

感谢:https://zhuanlan.zhihu.com/p/29578125

 

一、编译环境

VMware® Workstation 12 Pro 12.5.5 build-5234757

Ubuntu 16.04.2 LTS

虚拟机内存2G,20G硬盘,双处理器,每个处理器2核。我用的是渣渣电脑,所以虚拟机的配置比较差,整个编译流程耗时也长(整个流程跑下来大概要一个半小时吧),可以根据自己电脑的配置估算一下耗时。

事实上,只要步骤走对了,放在一边慢慢编译就行,我们可以跑去干些别的事情。

二、编译前的准备

(1)建立存放源码的目录

我建立了一个名为xie4ever的目录,用于存放jdk源码,以及放置编译好的jdk。

(2)获取jdk的源码

1.安装Mercurial

jdk的源码是使用Mercurial管理的,所以有必要下一个Mercurial。

官网为:https://www.mercurial-scm.org/downloads

官网上有安装方法。在Ubuntu下,直接apt-get即可。

2.获取源码

安装好之后,我们去openjdk的官网找源码,可以轻松找到jdk9的选项:http://hg.openjdk.java.net/jdk9

点进去之后,注意这里的选项:

11

这个选项是可以点进去的。此链接http://hg.openjdk.java.net/jdk9/jdk9/就是我们要的jdk源码。

在xie4ever目录下,使用Mercurial提供的hg命令下载源码:

等待一会即可,不超过5min(如果超时/下载失败,可以多尝试几次)。

需要注意的是,这里并没有下载所有源码。这部分下载完成后,需要运行jdk9目录下的get_source.sh脚本,下载所有源码。

这次等待的时间比较长,大概在10min左右。如果下载期间报错,就多重复几次,直至完成下载为止。

下载完成后,整个jdk9目录的大小在1个G左右。

三、编译

(1)准备boot jdk

jdk9的编译需要现成的jdk参与,而且jdk的版本不能太低。我个人的版本为:java version “1.8.0_131″,如果你当前的机器已经安装了jdk,需要注意一下版本。

如果版本太旧/没有装过jdk,在java官网下一个最新的tar.gz,解压待用即可。

(2)搞定编译环境

执行jdk9目录下的configure脚本:

该脚本会自动检测编译jdk所需要的环境。如果缺少环境就会报错。

如果你的机器已经安装了jdk,那么就不会报“缺少boot jdk”的错误。如果报出了该错误,可以使用–with-boot-jdk参数指定boot jdk:

过了boot jdk这一关后,configure将检查编译所需的库(一堆C++的依赖库),基本为以下几个:

libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev

缺少哪个都会有相应的提示,一路apt-get,跟着提示安装各种库即可:

如果最后不报错了,输出了一连串编译环境的信息,那就是编译环境准备好了。

(3)正式编译

在jdk9目录下执行make images指令,开始编译:

之后就是漫长的等待,大概要30min,干脆去吃个饭吧。

编译完成后会出现一个名为build的目录,一直cd进去就会发现一个名为jdk的目录,这就是我们要的jdk。

把这个目录复制出来:

进入jdk目录下的bin文件夹,可以看到一系列熟悉的java工具:

111

执行命令(注意这里不是直接java -version,否则会输出boot jdk的version了):

输出为:

编译成功,是时候体验java 9的魅力了。

同样的,如果想要编译其他版本的jdk(研究一下ClassLoader、双亲委派模型什么的),也可以通过以上流程去获取源码,进行相应的改动后,编译出自己想要的效果。

四、总结

最后感谢参考文章的作者@木女孩。没有她简明易懂的教程,我怕是要卡在某个莫名其妙的环节…