程序员进阶系列:实战自己动手编译 JDK

微信扫一扫,分享到朋友圈

程序员进阶系列:实战自己动手编译 JDK

1




 下载 JDK 源码 


如若针对业务开发而言,编译或者深入 JDK 源码,感觉没太大意义,但是若想要深入了解 Java 虚拟机的一些实现原理,那么自己动手编译 JDK 就显着非常有意义,那么如何下载 JDK 源码呢?

本文以 JDK 12 源码为例。



方式一:通过 Mercurial 代码版本管理工具取得源码。

# 安装版本控制工具
brew install mercurial
# 安装加速编译工具和编译中要依赖的freetype
brew install ccache freetype
# 下载源代码
hg clone https://hg.openjdk.java.net/jdk/jdk12


不过不推荐这种方式,原因试一下就知道,速度慢的惊人,而且多次 尝试都未成功下载(需要靠人品,哎!最近人品值暴跌)



方式二:直接访问 JDK 版本的仓库页面。

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

访问上面链接,然后点击“browse”链接,然后选择对应的压缩包(zip、gz)进行下载。

若喜欢用命令的话,可以尝试命令的形式。

wget http://hg.openjdk.java.net/jdk/jdk12/archive/06222165c35f.zip

2




 编译 JDK 源码 




第一步:解压下载的源码包。

进入解压后的源码包,先大致看看都是啥?在这里建议阅读一遍源码中的 README 文档(堪称:高手指路入门手册)以及 doc/building.html 文档 ,文档已经把如何编译 JDK 写的很清晰了,接下来跟随菜菜的脚步,一同尝试编译一把 JDK 源码。

不过在编译 JDK 源码前,考虑到没有必要给自己找麻烦,刚刚下载的源码,真心建议都不要放在包含中文的目录里面(这点或许已经成为编程圈里的行规啦)。




第二步:执行  configure 命令


可以通过执行 configure –help 命令了解命令的功能以及支持的参数,此命令主要
会进行依赖项检查、参数配置和构建输出目录结构等多项职责(类似这种脚本在编写 shell 脚本时倒是可以借鉴),并在检查失败时给出友好的解决指令(相当之友好,编写框架时倒也是可以借鉴)。

bash configure --with-boot-jdk=/Library/Java/JavaVirtualMachines/jdk-11.0.9.jdk/Contents/Home --with-debug-level=slowdebug  --disable-warnings-as-errors

如果执行命令后,出现下面提示,则恭喜你此步操作成功(看着很简单,不过现实的确很不幸,菜菜同学折腾了将近大半天才到此步,具体原因见文末的问题集锦)。



第三步:执行 make 命令。

待第二步依赖检查等环节通过后,就可以通过 make 命令正式进行编译啦,其中 make 命令的使用方式官方文档说的很清楚,有时间多瞅瞅。

make

不过友情提示:命令执行后,可以冲杯咖啡,边品咖啡边等待,估计要一杯咖啡的功夫。

如果看到上面输出,恭喜编译成功,在当前目录下会生成 build 目录,目录里的内容就是上面一系列命令操作的成果。



第四步:验证一下。

是骡子是马,还是要牵出来溜一溜。进入编译成功的 jdk 目录,执行如下命令,查看 JDK 的版本。

./java -version

输出如下,大功告成,喜大普奔。

3




 JDK 源码调试 


本次借助 IDE 集成开发工具进行 JDK 源码调试。



第一步:工欲善其事必先利其器。

首先在 JetBrains 网站上直接下载 CLion 免费使用 30 天。

下载链接:https://www.jetbrains.com/clion/download/



第二步:启动 CLion,并创建项目。



启动 CLion,并选择“New CMake Project from Sources”,在源码文件夹中填入 JDK 源码的根目录。

此时,CLion 已经自动选择好了需要导入的源码,导入完成后如上图所示。

接下来进行配置 Run/Debug Configurations。


在 Executable 项,选择上面刚刚编译出来的 java 命令,运行参数加上 -version,另外 把 Before launch 里面的 Build 去掉。

万事俱备就差设置断点调试啦,找到虚拟机启动的执行入口 java.c,然后在 JavaMain 方法上设置断点,开始运行调试,效果如下

4




 亲自操刀,为 JDK 添一笔 


既然学会了 JDK 源码调试,那为何不亲自动手,改一改源码呢?别犯怵,加一行日志都算修改过 JDK 的源码,碾压众多高级程序猿(吹牛 B,谁不会吹啊,只见天边飞了一只牛)。

还是针对执行入口 java.c 的 JavaMain 方法操作,加入一行代码(人过留名,雁过留声),改动如下。

再次执行 make 命令进行编译源代码,编译成功后,可以借助 IDEA 或者记事本写一个 HelloWorld.java,然后选择自己编译的 jdk,IDEA 操作效果如下。

程序运行一下,输出如下,看看惊不惊喜意不意外。

5




 问题集锦 



问题一:XCode 缺失或者版本不对。


提示:configure: error: No xcodebuild tool and no system framework headers found, use --with-sysroot or --with-sdk-name to provide a path to a valid SDK

最终解决:安装系统支持的 XCode,菜菜同学先后安装了 N 个版本,版本都不兼容,掉坑里拔不出来,菜菜同学 mac 系统版本是 10.15.2,最后安装一个近 8G 的 XCode_11 完美解决。



问题二、三、N,等其它错误。


进行源码编译过程中,问题主要集中在 configure 命令上,因为此命令会做依赖检查,不过在此命令的执行过程中,遇到错误以及解决方案提示已经很到位啦,相信根据提示大家都能够得到解决,再次推荐阅读官方入门文档 doc/ building.html,相信困惑都能迎刃而解。

6




 寄语 




「学」与「不学」的差距,



不断学习的效果。




「学」与「不学」的差距,




如果好吃懒做,停止学习











好了,本次就谈到这里,




一起聊技术、谈业务、喷架构,少走弯路,不踩大坑。

会持续输出原创精彩分享,敬请期待!



微信扫一扫,分享到朋友圈

程序员进阶系列:实战自己动手编译 JDK

CVE-2020-11651漏洞复现

上一篇

迎接双11,深度剖析高并发数据库Sharding的道与术

下一篇

你也可能喜欢

程序员进阶系列:实战自己动手编译 JDK

长按储存图像,分享给朋友