IDEA 搭建 JDK 源码工程简记

好记性不如烂笔头,记一篇 IDEA 中搭建 JDK 源码阅读工程的文章,防止下次踩坑,此次 JDK 版本为:1.8.0_261。

为什么要读 JDK 源码

阅读 JDK 源码是深入理解 Java 语言的最佳途径之一。通过源码可以了解:

  • HashMap、ConcurrentHashMap 等集合类的底层数据结构与实现细节
  • JVM 与操作系统交互的机制,如 nio 包中的内存映射文件
  • java.util.concurrent 包中并发工具类的设计思想
  • 面试中常见的源码分析问题,提升技术深度

前置条件

开始搭建之前,确保已具备以下环境:

条件说明
JDK 版本1.8.0_xxx(推荐与文章一致,避免兼容性问题)
IntelliJ IDEA2019.x 或更高版本

JDK 9+ 注意事项: JDK 9 引入了模块系统(java.base、java.sql 等模块),源码结构与 JDK 8 有较大差异,不再有统一的 src.zip。如果使用 JDK 9+,可参考 OpenJDK 仓库直接 clone 对应版本的源码,并通过 jigsaw 模块化方式导入。本文方法主要适用于 JDK 8。

搭建流程总览

导入源码

创建新的 Maven 项目工程,在 JDK 安装目录,找到 src.zip 源码文件,将其内容解压至 Maven 项目 src/main/java 目录下

导入源码

导入源码

所遇问题

  • Error:java: Compilation failed: internal java compiler error
  • Error:java: OutOfMemoryError: insufficient memory
  • 程序包 com.sun.tools.javac.api 不存在
  • UNIXToolkit、FontConfigManager 类不存在
  • Debug 无法 Step into 到 JDK 源码,即使可以也是不可修改源码文件(不利于学习 JDK 源码)。

问题解决方案

  1. Error:java: Compilation failed: internal java compiler error

编译时,IDEA JDK 版本未选对原因,配好如下 3 个选项。

问题解决方案

  1. Error:java: OutOfMemoryError: insufficient memory

编译时,内存不够的原因,导致堆内存溢出,更改编译时的堆内存大小即可,IDEA 默认设置为 700M,这里改为 1024M 即可。

问题解决方案

  1. 程序包 com.sun.tools.javac.api 不存在

缺失 tools.jar 包导致的问题,将 JDK lib 目录下的 tools.jar 配置进 Libraries 里。

问题解决方案

  1. UNIXToolkit、FontConfigManager 类不存在

JDK 源码中无此类,可点击此处,按如下操作,找到所需类:

问题解决方案

问题解决方案

双击上图所示的类,复制其内容,在工程中相应包位置创建如上两个类,并将内容复制进去即可

问题解决方案

  1. Debug 无法 Step into 到 JDK 源码,即使可以也是不可修改源码文件(不利于学习 JDK 源码)。

默认情况下,IDEA 设置 Debug 不让 Step into 到源码里,通过如下配置,将 Do not step into the classes 取消打钩即可。

问题解决方案

修改完后即可 Step into 到源码,但此时并不可以修改其内容,按照如下方法重新修改源码路径即可:

问题解决方案

以上,JDK 源码工程搭建完成!