前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >程序员进阶系列:实战自己动手编译 JDK

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

作者头像
一猿小讲
发布2020-11-11 16:15:27
1.1K0
发布2020-11-11 16:15:27
举报
文章被收录于专栏:一猿小讲一猿小讲

1

下载 JDK 源码

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

本文以 JDK 12 源码为例。

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

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

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

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

代码语言:javascript
复制
https://hg.openjdk.java.net/jdk/jdk12/

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

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

代码语言:javascript
复制
wget http://hg.openjdk.java.net/jdk/jdk12/archive/06222165c35f.zip

2

编译 JDK 源码

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

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

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

第二步:执行 configure 命令。

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

代码语言:javascript
复制
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 命令的使用方式官方文档说的很清楚,有时间多瞅瞅。

代码语言:javascript
复制
make

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

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

第四步:验证一下。

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

代码语言:javascript
复制
./java -version

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

3

JDK 源码调试

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

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

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

代码语言:javascript
复制
下载链接: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 缺失或者版本不对。

代码语言:javascript
复制
提示: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,相信困惑都能迎刃而解。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一猿小讲 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档