专栏首页一猿小讲程序员进阶系列:实战自己动手编译 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,相信困惑都能迎刃而解。

本文分享自微信公众号 - 一猿小讲(yiyuanxiaojiangV5),作者:一猿小讲

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-11-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 体验SpringBoot(2.3)应用制作Docker镜像(官方方案)

    至此,SpringBoot-2.3.0.RELEASE官方推荐的镜像构建方式就实践完成了,但是也留下了一些疑问:

    程序员欣宸
  • Java注解详解「注解项目实战」

    注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段...

    Java知音
  • 限量!Alibaba首发“Java成长笔记”,差距不止一点点

    关于技术人如何成长的问题,一直以来都备受关注,因为程序员职业发展很快,即使是相同起点的人,经过几年的工作或学习,会迅速拉开极大的差距,所以技术人保持学习,提升自...

    烂猪皮
  • 实现微信小程序编译和运行环境系列 (进阶篇)

    距离上一篇初始篇过了一段时间,在初始篇里面主要分享了微信小程序工具 和微信小程序的文件组成,以及小程序架构的基本大纲和描述,看了第一篇的小伙伴应该大概知道了微信...

    薛定喵君
  • 什么是JVM(上)

    JVM(Java Virtual Machine)是Java运行的基石。它向下通过映射规则关联并操作所有操作系统,向上提供一系列的JavaAPI。是Java与硬...

    陈不成i
  • StackOverflow上87万访问量的问题:什么是“找不到符号”?

    你好呀,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员。为了输出更好的内容,我就必须先输入更多的内容,于是我选择 Stack Overflow 作...

    沉默王二
  • Java虚拟机--Java发展史Java虚拟机

    贾博岩
  • Scala简介和安装

    云飞扬
  • 编译windows版的openJDK攻略

    小小明童鞋
  • 学习 Java,有什么书籍推荐?学习的方法和过程是怎样的?

    为什么要学 Linux 呢?因为在实际的开发工作中,项目基本上都要部署到 Linux 环境下。Windows 作为服务器的很少,除了慢没别的原因。

    AI码师
  • 2019 最新 Java 核心技术教程,都在这了!

    以下是Java技术栈微信公众号发布的所有关于 Java 的技术干货,会从以下几个方面汇总,本文会长期更新。

    Java技术栈
  • RSAC2019创新沙盒大赛公司shiftleft介绍

    本身Shift Left这个单词的在测试行业的意思就是将软件测试阶段尽量前置,测试、开发人员使用项目管理、自动化测试工具全量参与到软件开发活动中。Shi...

    安全乐观主义
  • 有史以来最详细的web前端学习攻略,还在等什么,直接收藏吧

    Js基础教程、js内置对象常用方法、常见DOM树操作大全、ECMAscript、DOM、BOM、定时器和焦点图。

    用户5827212
  • 夯实Java基础系列15:Java注解简介和最佳实践

    本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看

    Java技术江湖
  • Java后端2017书单推荐

    对于程序员来说,个人感觉最佳学习方式是看书,视频花费时间太长,而博客则不够系统。初学相关领域最好的方式就是找到一本经典的好书,然后啃完它。

    Java后端工程师
  • 字节Java全能手册火了!多线程/网络/性能调优/框架/算法啥都有

    在这个技术不断更新的年代,跟不上时代变化的速度就会被刷掉,特别是咱们程序员这一群体,技术不断更新的同时也要同时进步,不然长江后浪推前浪,前浪......

    烂猪皮
  • 必看!java后端,亮剑诛仙(最全知识点)

    你可能有所感悟。零散的资料读了很多,但是很难有提升。到处是干货,但是并没什么用,简单来说就是缺乏系统化。另外,噪音太多,雷同的框架一大把,我不至于全都要去学了...

    xjjdog
  • JAVA简介及特性

    兮动人
  • 你和阿里资深架构师之间,差的不仅仅是年龄(进阶必看)

    技术zhai

扫码关注云+社区

领取腾讯云代金券