按照《深入理解Java虚拟机》中的流程进行,有少许区别,记录如下
配置:Mac OS 10.15.7、XCode 12.0.1、jdk12、IDEA
下载代码
从
https://hg.openjdk.java.net/jdk/jdk12
下载代码一直失败,换成从github下载代码。
git clone git@github.com:openjdk/jdk.git
找到jdk12最后一次提交,tag=jdk-12-ga,本地切换到这个tag上。
编译
sh configure
执行默认配置项,会在/build下生成新的目录。
表示配置成功,过程中的问题靠提示可以解决。
make all或者make images
进行编译。
表示编译成功,过程中遇到的大部分问题在网上可以找到解决办法。
例外的是下面这个
error: comparison of different enumeration types in switch statement ('jvmtiHeapReferenceKind' and 'jvmtiObjectReferenceKind') [-Werror,-Wenum-compare-switch]
case JVMTI_REFERENCE_ARRAY_ELEMENT:
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
找到对应的源码修改记录,在本地做对应修改即可,
https://github.com/openjdk/jdk/commit/4dececb589289605d38b8de69f1f3dc7a9a8ecb1
编译完成后,得到的JDK在“JDK源码根目录/build/macosx-x86_64-server-release/jdk”目录下,这里就是可用的JDK,跟$JAVA_HOME里的一样。
使用
创建普通Java工程
执行,可以看出用的是$JAVA_HOME里的JDK
使用自己编译的JDK
再次执行,结果显示,使用的是自己编译的JDK
编辑源码
修改println方法
去JDK源码根目录重新编译JDK,使改动生效。回到代码再次执行,发现改动已经生效。