持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情
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 。
在这一步,我遇到了一些常见问题:
-
缺少依赖项,log 会提示通过 brew 指令安装缺失的依赖。
-
当前已安装的 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 版本了。
编译 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 的源码,这里有两种方式:
-
找到本机安装的 JDK 路径下的
src.zip文件,例如我的电脑上是:/Library/Java/JavaVirtualMachines/jdk-18.0.1.1.jdk/Contents/Home/lib/src.zip这种方式适用于查看稳定发行版本的 JDK 源码。
-
下载 Github 上的 jdk 源码,然后进行构建,从构建后的 JDK 目录中查找 src 文件。这种适用于拉取 Github 上的最新代码。例如,我们自己构建的
src.zip路径是:jdk 项目根目录/build/macosx-x86_64-server-release/images/jdk/lib/src.zip
然后我将找到的 src.zip 解压后的内容(src 目录下的所有内容),复制到项目中的 src 目录下。
然后需要新建一个自定义的 JDK ,并更新 JDK 的 Sourcepath:
更新 Sourcepath:
然后更新依赖设置为自定的 JDK:
运行项目,会发现所有的 module-info.java 都报错了:
这是因为我们项目编译的字节码版本还是 8 ,不支持 module 等关键字,修改项目编译的字节码版本:
然后就可以正常引用到 JDK 的源码并进行修改了,例如:
public class Main {
public static void main(String[] args) {
// write your code here
LinkedBlockingDeque deque = new LinkedBlockingDeque();
}
}
跳转到 LinkedBlockingDeque ,写一行备注:
这样就可以查看类关系和修改代码了。
解决运行内存不足问题
但上面的代码直接运行还是会报错:
需要修改设置: