深入理解java虚拟机: Windows下如何编译、调试JDK源码?

1,028 阅读3分钟

深入理解java虚拟机: Windows下如何编译、调试JDK源码?

官方链接: build openjdk

编译步骤

step 1: 下载JDK源码,项目路径中不能有空格 1

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

step2:准备编译环境

在windows环境下编译JDK需要准备3个工具,C/C++的编译器、最新的JDK和Cygwin.

备注:

  1. Hotspot jvm和一些类的native Method需要C/C++编译器编译;
  2. JDK 标准库需要最新发布的JDK来编译,官方称其为,book jdk,boot jdk主版本号要大于等于要构建版本的主版本号减1,也就是至少为上个jdk发行版;
  3. Cygwin主要是为windows提供相应的构建工具链,如提供bashconfiguremakezip

工具下载链接

step3: 配置构建环境 2

  1. 双击Cygwin64 Terminal,打开cygwin命令行

  2. 切换到 jdk-latest目录

    注意:windows目录与cygwin命令行下目录的对应关系

    假如jdk源码保存在D:\Programming\learnspace\cpp\jdk-latest文件夹下,那么在cygwin命令行中执行cd /cygdrive/d/Programming/learnspace/cpp/jdk-latest命令,切换到源码目录

  3. 配置JDK环境变量

        # 将下面命令<winpath to jdk>替换为解压后的jdk目录,将 :\ 替换为 /
        # 如 export JAVA_HOME=/cygdrive/d/usr/Apps/jdks/temurin-19.0.1
        export JAVA_HOME=/cygdriver/<winpath to jdk>
        export PATH=$JAVA_HOME/bin:$PATH
    

    最后输入 java -version,验证是否成功

  4. 配置make构建系统

    # 携带调试信息
    bash configure --with-toolchain-version=2019 --disable-warnings-as-errors --with-debug-level=slow --with-native-debug-symbols=zipped 
    

配置成功提示信息如下如所示 image.png

  1. 处理构建系统报错信息

    1. 路径中有空格 3

    解决方案: 以管理员身份打开cmd命令行,执行 fsutil file setshortname <含有空格的路径> <短名称>命令, 如: fsutil "d:\Program Files" dprogs

    如果修改失败(拒绝访问错误),则需要进入安全模式下命令行,执行上述命令

    1. 找不到 Microsoft Visual Studio4

    解决方案: 可以在Microsoft visual studio默认路径C:\Program Files (x86)\Microsoft Visual Studio下建立符号链接 如将你的visual studio安装D:\Program Files (x86)\Microsoft Visual Studio目录下, 使用如下命令建立符号链接

    mklink /D /J "C:\Program Files (x86)\Microsoft Visual Studio\2019" "D:\Program Files (x86)\Microsoft Visual Studio\2019" 
    

step4. make

# 构建jdk镜像
make images
# 构建vscode工程
make vscode-project

最后用vscode打开源码构建目录<winpath to jdk-latest>\build目录下生成vscode工作区文件(如下图,jdk.code-workspace就是vscode工程文件),就可以使用vscode查看和调试源码了; image.png

需要手动修改.vscode\Launch.json.vscode\Tasks.json启动配置才能启动调试

image.png

step5. 其他问题

我使用以上步骤成功在windows下编译了最新的jdk,可以使用windows下相关工具调试学习jdk源码了(调试jvm等); 由于windows下编译jdk有太多坑,通过上述方法无法编译的朋友,可以评论,根据我的经验给出解决建议。 Linux下编译JDK还是最简单的,但有些工具用着总感觉不顺手唉。

Footnotes

  1. 注意事项

  2. windows编译环境说明

  3. fsutil

  4. mklink