JDK(7和8) 源码搭建
本文最后更新于:12 天前
⚡方法一:
⚡方法二:
-
首先去官网下载对应系统版本的 JDK7 和 JDK8
(因为 JDK 不同版本的实现可能不一样,例如 HashMap 的底层实现由链表改成红黑树,所以下两个版本更保险)
注意一个很坑的地方:
不要下 Open JDK,之前下载了 OpenJDK7的源码,编译一直报错,但是去官网下载的 OracleJDK8 则没有问题!
-
下好后解压,源文件路径在
JDK 根目录(例如:/opt/jdk-8u212-linux-x64/jdk1.8.0_212/src.zip) 的 src.zip 解压后的文件
-
IDEA 下创建 maven 项目
-
创建好项目后,再创建两个 module: jdk7 和 jdk8,分别对应 jdk 的两个版本,对应的 language level 分别设定7和8
注意:
新建 module 的父 module 不能为空,一定要是原来的项目 module
-
把下好的源码包完整复制到对应 module 的src文件中,并且在 project structure 里面标记 src 文件夹为 source
-
-
整合依赖
-
打开 project structure, 找到最左边的 Libraries, 点击 + ,添加一个 新的 Project Library, 找到 jdk7 这个 module 的 src 文件夹,添加
jdk8 module 同理
-
Modules 侧边栏中, 选择 jdk7 module 上方的 dependencies, 在点击右侧的 + 号,添加 module dependency 可以看到之前添加的 Libraries jdk7,点击添加
jdk8 module 同理
-
第二坑的环节是这个: [1]
上一步 Libraries 添加好对应的 module 后,还必须将后添加的 Library 的顺序排到原来 module JDK 的前面,否则点击对应的类,还是使用 JDK 的字节码反编译后的文件
-
要注意版本,要在每个 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 的版本可以自由设置更高一些的版本
-
-
各自的模块编译一段时间没有报错后,就可以愉快的查看对应类的 .java 文件,而非字节码反编译的只读文件,还可以直接在源码上写注释啦!
-
如果想要测试,就可以直接在对应 JDK 的版本的 module 中写测试样例
-
如果想要 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 知识在实际应用中的点,以后有空了可以试着打破双亲委派机制,也是一个亮点
开源项目:
本博客所有文章除特别声明外,均采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 。转载请注明出处!