Play OpenJDK: 构建你自己的JDK
计划使Play OpenJDK成为一组介绍如何使用并参与OpenJDK项目的系列文章。本文是该系列的第一篇文章,它基于OpenJDK 8的源代码介绍了构建一个属于自己的JDK方法。(2015.10.30最后更新)
1. OpenJDK曾经的Sun Microsystems. Inc,也就是Java语言的发明者,将它的JDK代码贡献出来,成立了一个开源项目,即
OpenJDK。
同时,它也是一个社区。相关的公司,组织和个人在这个社区中协作开发OpenJDK。社区根据不同的领域或项目提供了一系列的
邮件列表,利益相关方或对其感兴趣的个人都可以订阅这些邮件列表去进行关注和讨论。例如,Java核心API的邮件列表是core-libs-dev@openjdk.java.net,关于java.lang,java.util等核心API的新特性都会在这里进行讨论,并对其最终的实现代码进行审查。任何将要进入OpenJDK版本库的源代码,无论是产品代码(即,要随JDK发布的程序),还是测试代码,都需要在社区中进行公开的代码审查。
选择一个自己感兴趣的领域或项目,加入它的邮件列表,长期跟踪它的发展,看着专家们的讨论、争论推动JDK的演进,学习开发者们的API设计与代码实现,...,这些对自己的成长都是极有帮助的。也许,还能看到一些有趣的八卦;-)
2. 准备工作在几种主流操作系统,Linux(如Ubuntu和Fedora),Windows(7和8),MacOS(Lion和Moutain Lion),中都可以构建OpenJDK,具体的细节可以参见
官方的一篇文档。
本文选择使用Ubuntu 14.04。坦白地说,选择使用Ubuntu,实是因为在Linux环境中构建OpenJDK非常简单。若在Windows中进行构建,则需要安装Visual Studio C++编译器。MacOS?嗯,我没有MBP。可能更多人平时是使用Windows,但安装一个Linux也不麻烦。先安装免费的VM工具
VirtaulBox,再去下载Ubuntu的
ISO文件,然后使用VirtualBox去安装Ubuntu。VirtualBox简单易用,网上的相关资料也非常的多。
OpenJDK的源文件版本库基于
Mercurial(hg),它是一个与Git相似的分布式版本控制工具。在Ubuntu中安装Mercurial只需要执行命令
$ sudo apt-get install mercurial
OpenJDK中各项目的源代码版本库的路径均在http://hg.openjdk.java.net/之下,在这里可以找到6,7,8,9和Jigsaw的源代码。其中JDK 8的最新开发版本库路径为http://hg.openjdk.java.net/jdk8u/jdk8u-dev/。
另外,构建OpenJDK时需要一个启动JDK,本文选择构建OpenJDK 8,那么启动JDK的版本应不低于7。
3. 下载源代码克隆版本库,
$ hg clone http://hg.openjdk.java.net/jdk8u/jdk8u-dev/ jdk8-src
requesting all changes
adding changesets
adding manifests
adding file changes
added 1570 changesets with 1958 changes to 141 files
updating to branch default
85 files updated, 0 files merged, 0 files removed, 0 files unresolved
进入源代码目录
$ cd jdk8-src/
OpenJDK的源代码版本库实际上包含多个独立的子版本库,需要执行如下脚本去分别下载各个子版本库的源代码,
$ sh get_source.sh
# Repositories: corba jaxp jaxws langtools jdk hotspot nashorn
corba: hg clone http://hg.openjdk.java.net/jdk8u/jdk8u-dev/corba corba
jaxp: hg clone http://hg.openjdk.java.net/jdk8u/jdk8u-dev/jaxp jaxp
corba: requesting all changes
jaxp: requesting all changes
4. 构建调用configure进行预构建,其中的参数--with-boot-jdk用于指定启动JDK的路径。如果启动JDK的java命令已存在于PATH环境变量中,该参数可以忽略。
$ sh configure --with-boot-jdk=/path/to/boot/jdk
该过程会检测构建环境是否符合要求,如有问题,它会给出提示。比如,
configure: error: Could not find X11 libraries. You might be able to fix this by running 'sudo apt-get install libX11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev'.
此时根据提示安装所需要的库即可。再重新执行上述configure命令,可能还会提示缺少其它的库,那么再次根据提示进行安装。如此反复,只到预构建成功完成。
最后就是进行构建,直接执行如下命令,
$ make all
在此过程中可以会遇到一些警告,不必理会,耐心等待...完成后,会出现如下的汇总信息,
----- Build times -------
Start 2015-10-30 22:11:10
End 2015-10-30 22:52:54
00:01:01 corba
00:01:08 demos
00:06:49 docs
00:19:37 hotspot
00:01:47 images
00:00:35 jaxp
00:00:49 jaxws
00:08:23 jdk
00:01:09 langtools
00:00:25 nashorn
00:41:44 TOTAL
-------------------------
Finished building OpenJDK for target 'all'
在当前路径下会生成一个build目录,构建好的JDK就在那里面。新JDK的具体路径类似于build/linux-x86_64-normal-server-release/images/jdk。可以执行如下命令去测试这个JDK,
$ build/linux-x86_64-normal-server-release/images/jdk/bin/java -version
openjdk version "1.8.0-internal"
OpenJDK Runtime Environment (build 1.8.0-internal-ubuntu_2015_10_30_22_07-b00)
OpenJDK 64-Bit Server VM (build 25.66-b00, mixed mode)