最近在看《深入理解Java虚拟机》一书,其中第一章有个实验,叫“自己编译JDK”,在做这个实验的过程中,踩了点坑,因此写篇博客记录下
首先准备一个linux环境,其它环境也可以,不过不在本博客介绍范围内,这里我用虚拟机安装了Ubuntu-18.04.5-desktop-amd64。
编译需要用到编译器GCC或者CLang,读者可以任选其一安装,这里博主根据书本推荐,使用下列命令安装了GCC:
sudo apt-get install build-essential
接着编译过程需要用到以下第三方库,读者需按照表格中的命令进行安装:
工具 | 库名称 | 安装命令 |
---|---|---|
FreeType | The FreeType Project | sudo apt-get install libfreetype6-dev |
CUPS | Common UNIX Printing System | sudo apt-get install libcups2-dev |
X11 | X Window System | sudo apt-get install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev |
ALSA | Advanced Linux Sound Architecture | sudo apt-get install libasound2-dev |
libffi | Portable Foreign Function Interface Library | sudo apt-get install libffi-dev |
Autoconf | Extensible Package of M4 Macros | sudo apt-get install autoconf |
在安装第三方库的时候,由于当时博主看的是PC版的微信读书,不能复制命令,于是就在安装X11的时候踩坑了,此处命令中的libx11-dev中的1是数字1,而不是字母L。
安装完第三方库,还需要安装个Bootstrap JDK,意思就是使用低版本的JDK去编译高版本的JDK,这里我们要编译的JDK版本为12,所以Bootstrap JDK就为JDK11,使用以下命令安装:
sudo apt-get install openjdk-11-jdk
到这里编译JDK的环境就搭建好了。
依照书中所说,获取源码有两种方式:
书作者在这里推荐第二种,因为源码地址在国外,使用第一种方式获取源码的话可能会花费很长时间,并且有可能会卡在某个地方。
不过我在这里建议大家使用第一种方式,因为我在网站上下载压缩包后,在后续编译过程中遇到了文件缺失的问题。
直接使用使用下列命令克隆源码:
hg clone https://hg.openjdk.java.net/jdk/jdk12
执行此命令可能会遇到错误,比如Mercurial未安装,可用下列命令安装:
sudo apt install mercurial
然后在执行上述克隆命令,最终会在当前目录生成一个叫jdk12的目录。
使用浏览器访问JDK12源码页面,在如下页面中:
点击左侧导航栏中的zip超链接,等待下载完成后会得到压缩包,自行解压即可。
根据源码中doc/building.html文档的指示,按照以下步骤可完成最简单的编译。
在源码根目录执行下列命令:
bash configure
这个命令在执行过程中会去校验是否安装了编译所需要的所有元素,如果少了某个库,命令就会执行失败,同时在命令行中打印安装该库的命令,各位按照提示安装即可,最后执行成功会打印如下图的信息:
命令执行完毕后,会在build文件夹下生成对应的文件,如图:
执行完4.1的命令后,同样在源码根目录执行下列命令:
make images
书作者启动了4条编译线程,8GB内存,全量编译大概用了15分钟,不过我编译的时候貌似挺快的,还是得看各位的机子性能吧。
命令执行完后,进入到目录“/jdk12/build/linux-x86_64-server-fastdebug/jdk/bin”下面,其中linux-x86_64-server-fastdebug为命令bash configure生成的文件夹,请自行替换,进入目录后,执行如下命令:
./java -version
本文对命令具体参数并未进行讲解,想要了解的可以直接看《深入理解Java虚拟机》一书,咱也不能真的全部都抄书是吧,想更深入理解的,直接看文档building.html也可以,讲的很详细,就是全都是英文的,不好看懂。
访问JetBrains官网下载CLion,这边可以下载最新的,也可以下载老版本的,我因为新版本的CLion导入项目的选项跟书中截图不太一样,所以特意下了2019.3的版本,在点击超链接后,再点击下图红框部分的Other version即可选择版本:
下载完成后会得到一个压缩包,自行解压完毕,进入目录“/clion-2019.3.6/bin”,执行如下命令启动CLion:
./clion.sh
启动CLion后会进入如下界面:
注:黑色的图片会有很明显的CSDN的水印,我没找到怎么去,各位将就着看一下。
选择第二项“New CMake Project from Sources”,在打开的弹窗中选择jdk12文件夹,点击ok导入工程,进入如下界面:
这里我看了好多博客,都表示这一步直接默认点击OK即可,但是我这么做后,在后续步骤中找不到我所编译生成的jdk12的可执行文件,所以这边大家把下图中的bin文件夹勾选上:
点击ok,进入工程,CLion会自动生成文件CMakeLists.txt,这个文件是用来编译工程的,我们暂时不需要这个,进入工程后会有一个编译报错,不要管它,在CLion右上角找到下图的选项,点击Edit Configurations:
在Run/Debug Configurations界面里有个默认的jdk12的CMake Application,我们新建一个CMake Application:
这里面也踩了次坑,书中说要删除Build,但是这个Build它太小了,当时我没看到,结果每次Debug的时候都默认进行编译,然后自然就是编译失败了。
新建完CMake Application后,点击OK,回到工程页面,做下Debug测试:
如果成功的话,程序会停在JavaMain的第一行,并且会传入一个“-version”的参数,如下图:
点击继续运行,最后输出如图:
表明使用CLion调试JDK源码初步成功
一开始觉得这个第一章的实验很简单,做起来到处是坑,一会儿源码少文件,一会儿这边操作出问题,希望本博客能让大家少踩点坑吧。