JDK源码阅读环境和编译

577 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情

源码下载:github.com/openjdk/jdk

OpenJDK 官方网站:openjdk.org/

构建教程:Building the JDK

JDK 下载:Java 下载

构建自己的 JDK

获取源码

本地编译的是去拉取最新的 OpenJDK 代码,拉取官方的源码:

git clone https://git.openjdk.java.net/jdk/

当然也可以从 Github 上拉取最新的代码:

git clone https://github.com/openjdk/jdk.git

生成配置文件

bash configure

如果这一步执行失败,主要是缺少依赖,包括 toolchain 、构建工具、外部框架或 Boot JDK 。大多数情况下,log 中会给出用来解决构建失败建议执行的说明,按照说明进行操作,然后再次运行 bash configure

在这一步,我遇到了一些常见问题:

  1. 缺少依赖项,log 会提示通过 brew 指令安装缺失的依赖。

  2. 当前已安装的 JDK 版本与脚本建议的 Boot JDK 版本不一致。

    这个时候会提示报错:

    configure: Potential Boot JDK found at /Library/Java/JavaVirtualMachines/jdk-14.0.1.jdk/Contents/Home is incorrect JDK version (java version "14.0.1" 2020-04-14 Java(TM) SE Runtime Environment (build 14.0.1+7) Java HotSpot(TM) 64-Bit Server VM (build 14.0.1+7, mixed mode, sharing)); ignoring
    configure: (Your Boot JDK version must be one of: 18 19) // 【重点信息】
    configure: Could not find a valid Boot JDK. OpenJDK distributions are available at http://jdk.java.net/.
    configure: This might be fixed by explicitly setting --with-boot-jdk
    configure: error: Cannot continue
    /Users/chunyu/WorkProject/jdk/build/.configure-support/generated-configure.sh: line 84: 5: Bad file descriptor
    configure exiting with result code 1
    

    上面的 log 中就说明了问题是因为 Boot JDK 版本不对,修复建议是 Your Boot JDK version must be one of: 18 19

    这个时候就要去官网下载正确的 JDK 版本了。

    Java Developer Kit 下载

    编译 JDK 需要电脑安装后编译版本推荐依赖版本的 JDK,否则就会卡在第二步。预装好的 JDK 称之为引导 JDK (Boot JDK)。

    一般 Boot JDK 的版本规则是,用于构建 JDK 主版本 N 的引导 JDK 应该是主版本 N-1的 JDK,例如构建 JDK 9 , JDK 8将适合作为引导 JDK 。

    如果电脑上安装了多个版本的 JDK,bash configure 命令自动选择了错误的版本,可以使用 --with-boot-jdk 来指定正确的 JDK 路径:

    bash configure --with-boot-jdk /Library/Java/JavaVirtualMachines/jdk-18.0.1.1.jdk/Contents/Home
    

这一步运行成功后,log 中会打印一些配置信息:

A new configuration has been successfully created in
/Users/chunyu/WorkProject/jdk/build/macosx-x86_64-server-release
using default settings.

Configuration summary:
* Name:           macosx-x86_64-server-release
* Debug level:    release
* HS debug level: product
* JVM variants:   server
* JVM features:   server: 'cds compiler1 compiler2 dtrace epsilongc g1gc jfr jni-check jvmci jvmti management parallelgc serialgc services shenandoahgc vm-structs zgc' 
* OpenJDK target: OS: macosx, CPU architecture: x86, address length: 64
* Version string: 19-internal-adhoc.chunyu.jdk (19-internal)
* Source date:    Determined at build time

Tools summary:
* Boot JDK:       java version "18.0.1.1" 2022-04-22 Java(TM) SE Runtime Environment (build 18.0.1.1+2-6) Java HotSpot(TM) 64-Bit Server VM (build 18.0.1.1+2-6, mixed mode, sharing) (at /Library/Java/JavaVirtualMachines/jdk-18.0.1.1.jdk/Contents/Home)
* Toolchain:      clang (clang/LLVM from Xcode 12.5.1)
* C Compiler:     Version 12.0.5 (at /usr/bin/clang)

运行构建命令

执行 make images 命令,构建 JDK 。

Creating ...
Creating jdk image
Creating CDS archive for jdk image
Creating CDS-NOCOOPS archive for jdk image
Finished building target 'images' in configuration 'macosx-x86_64-server-release'

等待构建命令运行结束后,运行 ./build/*/images/jdk/bin/java -version ,查看构建的 JDK 版本信息。

openjdk version "19-internal" 2022-09-20
OpenJDK Runtime Environment (build 19-internal-adhoc.chunyu.jdk)
OpenJDK 64-Bit Server VM (build 19-internal-adhoc.chunyu.jdk, mixed mode, sharing)

构建好的 JDK 路径:

项目根目录/build/macosx-x86_64-server-release/images/jdk

如遇其他问题可参考官方构建文档:Building the JDK

IDEA 运行 JDK 源码

IDEA 打开 JDK 源码,需要借助一个 Java 项目。创建一个 Command Line App ,然后开始导入 JDK 源码。

先去找 JDK 的源码,这里有两种方式:

  1. 找到本机安装的 JDK 路径下的 src.zip 文件,例如我的电脑上是:

    /Library/Java/JavaVirtualMachines/jdk-18.0.1.1.jdk/Contents/Home/lib/src.zip
    

    这种方式适用于查看稳定发行版本的 JDK 源码。

  2. 下载 Github 上的 jdk 源码,然后进行构建,从构建后的 JDK 目录中查找 src 文件。这种适用于拉取 Github 上的最新代码。例如,我们自己构建的 src.zip路径是:

    jdk 项目根目录/build/macosx-x86_64-server-release/images/jdk/lib/src.zip
    

然后我将找到的 src.zip 解压后的内容(src 目录下的所有内容),复制到项目中的 src 目录下。

image.png

然后需要新建一个自定义的 JDK ,并更新 JDK 的 Sourcepath:

image-20220620013452688.png

更新 Sourcepath:

image.png

然后更新依赖设置为自定的 JDK:

image-20220620013743848.png

运行项目,会发现所有的 module-info.java 都报错了:

image-20220620015238738.png

这是因为我们项目编译的字节码版本还是 8 ,不支持 module 等关键字,修改项目编译的字节码版本:

image.png

然后就可以正常引用到 JDK 的源码并进行修改了,例如:

public class Main {

    public static void main(String[] args) {
       // write your code here
        LinkedBlockingDeque deque = new LinkedBlockingDeque();
    }
}

跳转到 LinkedBlockingDeque ,写一行备注:

image.png

这样就可以查看类关系和修改代码了。

解决运行内存不足问题

但上面的代码直接运行还是会报错:

image-20220620141519512.png

需要修改设置:

image-20220620013914420.png