JDK(7和8) 源码搭建

本文最后更新于:12 天前

方法一:

能够用的方法,这样直接修改了源文件,感觉不太好

方法二:

  1. 首先去官网下载对应系统版本的 JDK7 和 JDK8

    (因为 JDK 不同版本的实现可能不一样,例如 HashMap 的底层实现由链表改成红黑树,所以下两个版本更保险)

    注意一个很坑的地方:

    不要下 Open JDK,之前下载了 OpenJDK7的源码,编译一直报错,但是去官网下载的 OracleJDK8 则没有问题!

  2. 下好后解压,源文件路径在

    JDK 根目录(例如:/opt/jdk-8u212-linux-x64/jdk1.8.0_212/src.zip) 的 src.zip 解压后的文件

  3. IDEA 下创建 maven 项目

    1. 创建好项目后,再创建两个 module: jdk7 和 jdk8,分别对应 jdk 的两个版本,对应的 language level 分别设定7和8

      注意:

      新建 module 的父 module 不能为空,一定要是原来的项目 module

    2. 把下好的源码包完整复制到对应 module 的src文件中,并且在 project structure 里面标记 src 文件夹为 source

  4. 整合依赖

    1. 打开 project structure, 找到最左边的 Libraries, 点击 + ,添加一个 新的 Project Library, 找到 jdk7 这个 module 的 src 文件夹,添加

      jdk8 module 同理

    2. Modules 侧边栏中, 选择 jdk7 module 上方的 dependencies, 在点击右侧的 + 号,添加 module dependency 可以看到之前添加的 Libraries jdk7,点击添加

      jdk8 module 同理

    3. 第二坑的环节是这个: [1]

      上一步 Libraries 添加好对应的 module 后,还必须将后添加的 Library 的顺序排到原来 module JDK 的前面,否则点击对应的类,还是使用 JDK 的字节码反编译后的文件

    4. 要注意版本,要在每个 module的 pom.xml 文件里面指定 Java 版本(complier version 和 target version)

      例如:

      <properties>
          <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
          <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
          <java.version>1.7</java.version>
          <maven.compiler.source>1.7</maven.compiler.source>
          <maven.compiler.target>1.7</maven.compiler.target>
          <encoding>UTF-8</encoding>
      </properties>

      运行时的环境要比较低,用1.7即可,而 各自 module 的版本可以自由设置更高一些的版本

  5. 各自的模块编译一段时间没有报错后,就可以愉快的查看对应类的 .java 文件,而非字节码反编译的只读文件,还可以直接在源码上写注释啦!

  6. 如果想要测试,就可以直接在对应 JDK 的版本的 module 中写测试样例

  7. 如果想要 debug 那么就要在 settings --> debug --> Stepping --> Do not step into the classes 下 , 把 Java.* 取消勾选

    之后打上断点就可以看看 JDK 程序是如何一步步跳转调用的了

    如果 debug 进入到了 URLClassLoader 里面,就去下方的 BreakPoints,把 Java Exception BreakPoints 取消勾选

    如果有一些通用性的类不想进入,例如 Object,可在 settings 的 Do not step into the classes 中加入相关的类

    但是需要注意:
    如果要写注释,尽量不要增加行,否则调试的位置就会和本来的位置不一致

    还以为可能是 JVM 去掉了注释的原因?但是源代码也有自己的注释,debug 时不会出问题

    可以确认是由于类加载子系统的双亲委派模型的原因,导致即使在编辑器可以设定更改指向文件,但是对于 JVM 来说,只要你没有打破双亲委派模型,虚拟机就不会去加载你项目中的同名类

    ps: 这里可以算得上是 JVM 知识在实际应用中的点,以后有空了可以试着打破双亲委派机制,也是一个亮点


开源项目:

  1. (https://github.com/kangjianwei/LearningJDK#start-of-content)

  2. (https://github.com/raysonfang/jdk1.8-source-analysis)


  1. 参考博客 ↩︎