实战:自己编译JDK

实战:自己编译JDK

参考周志明老师的《深入理解Java虚拟机》第3版的第一章,自己动手实践了一下编译JDK

1.获取源码

选用OpenJDK12来编译,打开jdk版本仓库页面http://hg.openjdk.java.net/jdk/jdk12/,点击左边菜单中的"Browse"将显示源码根目录页面。

image-20210801150626131

点击左侧的"zip"链接即可下载当前版本打包好的源码。

image-20210801150739161

2.系统需求

尽量在Linux或MacOS上构建OpenJDK,这两个系统在准备构建工具链和依赖项上要比在Windows或Solaris平台上要容易许多。本次实践将以Ubuntu 18.04.05 LTS为平台进行构建。

Ubuntu 18.04.05 LTS下载地址

选择64位桌面版

image-20210801151201789

本次编译采用64位操作系统,默认参数下编译出来的也是64位的OpenJDK,如果需要编译32位版本,同样推荐在64位的操作系统上进行,理由是编译过程可以使用更大内存(32位系统受4G内存限制),通过编译参数(–with-target-bits=32)来指定需要生成32位编译结果即可。在官方文档上要求编译OpenJDK至少需要24G的内存空间,而且至少要68GB的空闲磁盘空间。

安装Ubuntu教程

3.构建编译环境

Ubuntu里用户可以自行选择安装GCC或CLang来进行编译,但必须保证最低的版本为GCC 4.8或者CLang 3.2以上,官方推荐使用GCC 7.8或者CLang 9.1来完成编译。在Ubuntu系统上安装GCC的命令为:

sudo apt-get install build-essential

image-20210801184601710

在编译过程中需要依赖FreeType、CUPS等若干第三方库,OpenJDK全部的依赖库已在下表列出,可执行相应的安装命令来完成安装。

工具库名称安装命令
FreeTypeThe FreeType Projectsudo apt-get install libfreetype6-dev
CUPSCommon UNIX Printing Systemsudo apt-get install libcups2-dev
X11X Window Systemsudo apt-get install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev
ALSAAdvanced Linux Sound Architecturesudo apt-get install libasound2-dev
libffiPortable Foreign Function Interface Librarysudo apt-get install libffi-dev
AutoconfExtensible Package of M4 Macrossudo apt-get install autoconf

编译大版本号为N的JDK,我们还要另外准备一个大版本号至少为N-1的、已经编译好的JDK。编译OpenJDK 12时,Bootstrap JDK必须要使用JDK11及之后的版本。在Ubuntu中使用以下命令安装OpenJDK 11:

sudo apt-get install openjdk-11-jdk

image-20210801185046855

4.进行编译

需要下载的编译环境和依赖项目都齐备后,我们就可以按照默认配置来开始编译了。但通常我们编译OpenJDK的目的都不仅仅是为了得到在自己机器中诞生的编译成品,而是带着调试、定制化等需求,这样就必须了解OpenJDK提供的编译参数才行,这些参数可以使用“bash configure --help"命令查询到。

image-20210802152808088

所有参数均通过以下形式使用:

bash configure [options]

譬如,编译FastDebug版、仅含Serve模式的HotSpot虚拟机,命令应为:

bash configure --enable-debug --with-jvm-variants=server

image-20210802152929295

如果编译过程中需要的工具类或者依赖项有缺失,命令执行后将会得到明确的提示,并且给出该依赖的安装命令,如我就缺少了libfontconfig1-dev,感觉是作者故意没说。

image-20210802153203515

一切顺利就会收到配置成功的提示,并且输出调试级别,Java虚拟机的模式、特性,使用的编译器版本等配置摘要信息,如下所示。

image-20210802153437333

依赖检测通过后便可以输入“make”执行整个OpenJDK编译了。

image-20210802154128007

如果电脑配置不高的话现在就可以去开始一把游戏或者看两集电视剧了,我只给虚拟机分配了一个核心和4GB内存,编译花了差不多40分钟。

编译完成如下所示

image-20210802162208794

编译完成后进入OpenJDK源码的“build/配置名称/jdk"就可以看到OpenJDK的完整编译结果了。

编译完成后”build/配置名称“目录下结构如下图所示:

image-20210802162606844

如果多次编译,或者目录结构成功产生后又再次修改了配置,必须先使用“make clean"和”make dist-clean"命令清理目录,才能确保新的配置生效。

“build/配置名称/jdk"下目录结构如下图所示:

image-20210802162823862

进入“build/配置名称/jdk/bin"目录,输入以下命令验证jdk版本。

./java -version

输入如下,宣告成功。

image-20210802163216142

5.在IDE工具中进行源码调试

本次实战中,这里建议使用的IDE是JetBrian的CLion 2020.1.3及之前的版本,可以在JetBrian官网下载并免费使用30天,学生可以验证免费使用。我原本下载的是最新的CLion 2021.2,但新版本没有“New CMake Project from Sources”,我搞了半天也没能生成CMakeLists.txt,放弃了,下面是官网的说明,可以参考一下,反正我是行不通。Clion官网的说明是打开CMake项目的根目录,打开一个源文件在编辑器中,如果在顶层目录中没有CMakeLists.txt文件,CLion会建议创建一个。有弄出来的小伙伴可以指导一下。

image-20210802171731103

CLion安装后,新建一个项目,选择“New CMake Project from Sources”,在源码文件夹中填入OpenJDK源码根目录,此时CLion已经自动选择好了需要导入的源码,如下图所示。点击OK按钮就会自动导入源码并自动创建好CMakeLists.txt文件。

image-20210802205816100

这份自动生成的CMakeLists.txt并不能直接使用,OpenJDK本身也没有为任何IDE提供支持,但如果只是为了能够在CLion中追踪、阅读源码,而不需要修改重新编译的话,直接在Run/Debug Configuration中增加一个CMake Application,然后Executable选择我们刚才编译出来的FastDebug的java命令,运行参数加上-version或者某个Class文件的路径,再把Before launch里面的Build去掉,就可以开始运行调试了,如下图所示。

image-20210803153533971

image-20210803153618369

运行结果如下图所示。

image-20210803153822094

HotSpot虚拟机启动器的执行入口是java.c的JavaMain()方法,可以设置断点单步跟踪,如下图所示。

image-20210803154258042

花了差不多三个下午终于做完了,中间遇到了不少困难,总算还是做完了。

  • 34
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值