熟悉 Java 的同学天天和各类 class 打交道,除了按时交付功能外,早晚会遇到一些棘手问题,比如 synchroinzed 与 ReentrantLock 差别在那里,GC 为何频繁发生,要回答这些问题,除了借助于 Google 搜索,更有效的途径就是 read the fucking source code,只不过这捷径入门门槛对于不会写 C/C++ 的同学来说有些高。
但凡事皆有起始,在喜欢的编辑器里去浏览无数前辈们的智慧成果,这不得不说是种精神享受。这篇文章说下我阅读 openjdk 源码的一些准备工作,帮助后来有类似需求的同学。
环境
- MacOS + brew
- Emacs + Ctags 浏览代码,主要是代码跳转
- Mercurial 下载源码用,本文也提供网盘下载链接,方便网速不好的同学使用。
准备
# 使用 Mercurial 下载源码
# 这里的 jdk8u 表示的是 jdk8 的 update,是 jdk8 的超集。推荐下载这个
hg clone http://hg.openjdk.java.net/jdk8u/jdk8u jdk8u
cd jdk8u
# 下载子项目
bash get_source.sh
# 也可以把 jdk10 一起下载下来
hg clone http://hg.openjdk.java.net/jdk10/jdk10 jdk10
国内下载代码比较慢,而且容易中断,我是专门找了个 US 的 vps 下载,然后 scp 到本地,为方便大家使用,可以去下面的网盘地址下载(包含2个 tar 文件)
链接: https://pan.baidu.com/s/1DOemBTVj-oIk8DBxknq_nw 提取码: yrib
-rw-r--r-- 1 staff staff 578M Jan 6 11:03 jdk10.tar.gz
-rw-r--r-- 1 staff staff 363M Jan 5 12:55 jdk8u.tar.gz
下完源码后,就可以在自己喜欢的编辑器里去浏览了,Ctags 可以生成代码的索引,常用的编辑器,如 Vim/Emacs 都可以去识别
# Mac 自带的 xcode 有 ctags 命令,但是不支持 -R 选项,所以需要通过 brew 重新安装下
# 参考:https://gist.github.com/nazgob/1570678
brew install ctags
cd jdk8u
ctags -Re .
这样就能够在 jdk8u 这个目录里生成 TAGS 文件,大概 8.7M,在 Emacs 里面的使用效果(M+.
跳转到定义的地方,M+,
跳回来)
好了,有了代码跳转对于阅读源码已经足够了。