JDK编译以及在CLion中进行源码调试(抄书+踩坑记录)

1、写在前面

最近在看《深入理解Java虚拟机》一书,其中第一章有个实验,叫“自己编译JDK”,在做这个实验的过程中,踩了点坑,因此写篇博客记录下

2、环境准备

首先准备一个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的环境就搭建好了。

3、获取源码

依照书中所说,获取源码有两种方式:

  • 第一种是用版本控制工具(Mercurial)获取源码
  • 第二种是登录网站直接下载压缩包

书作者在这里推荐第二种,因为源码地址在国外,使用第一种方式获取源码的话可能会花费很长时间,并且有可能会卡在某个地方。
不过我在这里建议大家使用第一种方式,因为我在网站上下载压缩包后,在后续编译过程中遇到了文件缺失的问题。

3.1 第一种方式

直接使用使用下列命令克隆源码:

hg clone https://hg.openjdk.java.net/jdk/jdk12

执行此命令可能会遇到错误,比如Mercurial未安装,可用下列命令安装:

sudo apt install mercurial

然后在执行上述克隆命令,最终会在当前目录生成一个叫jdk12的目录。

3.2 第二种方式

使用浏览器访问JDK12源码页面,在如下页面中:
JDK编译以及在CLion中进行源码调试(抄书+踩坑记录)_第1张图片
点击左侧导航栏中的zip超链接,等待下载完成后会得到压缩包,自行解压即可。

4、编译过程

根据源码中doc/building.html文档的指示,按照以下步骤可完成最简单的编译。

4.1 Run configure

在源码根目录执行下列命令:

bash configure

这个命令在执行过程中会去校验是否安装了编译所需要的所有元素,如果少了某个库,命令就会执行失败,同时在命令行中打印安装该库的命令,各位按照提示安装即可,最后执行成功会打印如下图的信息:
JDK编译以及在CLion中进行源码调试(抄书+踩坑记录)_第2张图片
命令执行完毕后,会在build文件夹下生成对应的文件,如图:
命令执行结果截图

4.2 Run make

执行完4.1的命令后,同样在源码根目录执行下列命令:

make images

书作者启动了4条编译线程,8GB内存,全量编译大概用了15分钟,不过我编译的时候貌似挺快的,还是得看各位的机子性能吧。

4.3 验证结果

命令执行完后,进入到目录“/jdk12/build/linux-x86_64-server-fastdebug/jdk/bin”下面,其中linux-x86_64-server-fastdebug为命令bash configure生成的文件夹,请自行替换,进入目录后,执行如下命令:

./java -version

得到如下截图的界面:
编译结果截图
表明jdk编译成功。

4.4 其他

本文对命令具体参数并未进行讲解,想要了解的可以直接看《深入理解Java虚拟机》一书,咱也不能真的全部都抄书是吧,想更深入理解的,直接看文档building.html也可以,讲的很详细,就是全都是英文的,不好看懂。

5、在CLion中调试

5.1 下载CLion

访问JetBrains官网下载CLion,这边可以下载最新的,也可以下载老版本的,我因为新版本的CLion导入项目的选项跟书中截图不太一样,所以特意下了2019.3的版本,在点击超链接后,再点击下图红框部分的Other version即可选择版本:
JDK编译以及在CLion中进行源码调试(抄书+踩坑记录)_第3张图片

5.2 启动CLion

下载完成后会得到一个压缩包,自行解压完毕,进入目录“/clion-2019.3.6/bin”,执行如下命令启动CLion:

./clion.sh

5.3 导入项目

启动CLion后会进入如下界面:
JDK编译以及在CLion中进行源码调试(抄书+踩坑记录)_第4张图片
注:黑色的图片会有很明显的CSDN的水印,我没找到怎么去,各位将就着看一下。
选择第二项“New CMake Project from Sources”,在打开的弹窗中选择jdk12文件夹,点击ok导入工程,进入如下界面:
JDK编译以及在CLion中进行源码调试(抄书+踩坑记录)_第5张图片

这里我看了好多博客,都表示这一步直接默认点击OK即可,但是我这么做后,在后续步骤中找不到我所编译生成的jdk12的可执行文件,所以这边大家把下图中的bin文件夹勾选上:
JDK编译以及在CLion中进行源码调试(抄书+踩坑记录)_第6张图片
点击ok,进入工程,CLion会自动生成文件CMakeLists.txt,这个文件是用来编译工程的,我们暂时不需要这个,进入工程后会有一个编译报错,不要管它,在CLion右上角找到下图的选项,点击Edit Configurations:
JDK编译以及在CLion中进行源码调试(抄书+踩坑记录)_第7张图片
在Run/Debug Configurations界面里有个默认的jdk12的CMake Application,我们新建一个CMake Application:

  • 点击左上角那个加号,选择新建CMake Application
  • 在右边填写Name,叫啥都行
  • Executable选择我们编译生成的可执行文件java,地址为“jdk12/build/linux-x86_64-server-fastdebug/jdk/bin/java”
  • Program arguments处填写“-version”
  • 选择Build进行删除

JDK编译以及在CLion中进行源码调试(抄书+踩坑记录)_第8张图片
这里面也踩了次坑,书中说要删除Build,但是这个Build它太小了,当时我没看到,结果每次Debug的时候都默认进行编译,然后自然就是编译失败了。
新建完CMake Application后,点击OK,回到工程页面,做下Debug测试:

  • 首先找到java.c文件,目录为“jdk12/src/java.base/share/native/libjli/”
  • 在java.c文件中找到JavaMain函数
  • 在JavaMain函数第一行代码处打上断点
  • 启动Debug,注意要选择刚才新建的CMake Application

如果成功的话,程序会停在JavaMain的第一行,并且会传入一个“-version”的参数,如下图:
JDK编译以及在CLion中进行源码调试(抄书+踩坑记录)_第9张图片
点击继续运行,最后输出如图:
JDK编译以及在CLion中进行源码调试(抄书+踩坑记录)_第10张图片
表明使用CLion调试JDK源码初步成功

6、写在后面

一开始觉得这个第一章的实验很简单,做起来到处是坑,一会儿源码少文件,一会儿这边操作出问题,希望本博客能让大家少踩点坑吧。

你可能感兴趣的:(Java学习,java,虚拟机,CLion,linux,jdk)