自己动手在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。
1 |
root@ubuntu:/xie4ever# mkdir xie4ever |
(2)获取jdk的源码
1.安装Mercurial
jdk的源码是使用Mercurial管理的,所以有必要下一个Mercurial。
官网为:https://www.mercurial-scm.org/downloads
官网上有安装方法。在Ubuntu下,直接apt-get即可。
1 |
root@ubuntu:/xie4ever# apt-get install mercurial |
2.获取源码
安装好之后,我们去openjdk的官网找源码,可以轻松找到jdk9的选项:http://hg.openjdk.java.net/jdk9。
点进去之后,注意这里的选项:
这个选项是可以点进去的。此链接http://hg.openjdk.java.net/jdk9/jdk9/就是我们要的jdk源码。
在xie4ever目录下,使用Mercurial提供的hg命令下载源码:
1 |
root@ubuntu:/xie4ever# hg clone http://hg.openjdk.java.net/jdk9/jdk9/ |
等待一会即可,不超过5min(如果超时/下载失败,可以多尝试几次)。
需要注意的是,这里并没有下载所有源码。这部分下载完成后,需要运行jdk9目录下的get_source.sh脚本,下载所有源码。
1 2 |
root@ubuntu:/xie4ever/jdk9# chmod u+x ./get_source.sh root@ubuntu:/xie4ever/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脚本:
1 2 |
root@ubuntu:/xie4ever/jdk9# chmod u+x ./configure.sh root@ubuntu:/xie4ever/jdk9# ./configure.sh |
该脚本会自动检测编译jdk所需要的环境。如果缺少环境就会报错。
如果你的机器已经安装了jdk,那么就不会报“缺少boot jdk”的错误。如果报出了该错误,可以使用–with-boot-jdk参数指定boot jdk:
1 |
root@ubuntu:/xie4ever/jdk9# ./configure --with-boot-jdk=jdk所在的目录 |
过了boot jdk这一关后,configure将检查编译所需的库(一堆C++的依赖库),基本为以下几个:
libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev
缺少哪个都会有相应的提示,一路apt-get,跟着提示安装各种库即可:
1 |
root@ubuntu:/xie4ever/jdk9# apt-get install libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev |
如果最后不报错了,输出了一连串编译环境的信息,那就是编译环境准备好了。
(3)正式编译
在jdk9目录下执行make images指令,开始编译:
1 |
root@ubuntu:/xie4ever/jdk9# make images |
之后就是漫长的等待,大概要30min,干脆去吃个饭吧。
编译完成后会出现一个名为build的目录,一直cd进去就会发现一个名为jdk的目录,这就是我们要的jdk。
把这个目录复制出来:
1 |
root@ubuntu:/xie4ever/jdk9# cp -R /xie4ever/jdk9/build/linux-x86_64-normal-server-release/jdk 你喜欢的目录(注意两个目录之间的空格) |
进入jdk目录下的bin文件夹,可以看到一系列熟悉的java工具:
执行命令(注意这里不是直接java -version,否则会输出boot jdk的version了):
1 |
root@ubuntu:/xie4ever/jdk/bin# ./java -version |
输出为:
1 2 3 4 |
root@ubuntu:/xie4ever/jdk/bin# ./java -version openjdk version "9-internal" OpenJDK Runtime Environment (build 9-internal+0-adhoc.root.jdk9) OpenJDK 64-Bit Server VM (build 9-internal+0-adhoc.root.jdk9, mixed mode) |
编译成功,是时候体验java 9的魅力了。
同样的,如果想要编译其他版本的jdk(研究一下ClassLoader、双亲委派模型什么的),也可以通过以上流程去获取源码,进行相应的改动后,编译出自己想要的效果。
四、总结
最后感谢参考文章的作者@木女孩。没有她简明易懂的教程,我怕是要卡在某个莫名其妙的环节…