如何在OpenJDK 24源码中集成Kotlin代码并编译自定义JDK
OpenJDK 24 集成 Kotlin 编译与 Runtime 整合指南
一、解决 Kotlin 代码未编译导致的空包问题
OpenJDK 的 make 构建链默认只处理 Java 源码,完全忽略 Kotlin 文件,这就是你遇到“导出包为空”“类引用无法解析”的核心原因。以下是手动插入 Kotlin 编译流程的步骤:
1. 单独编写 Kotlin 编译脚本
在你的自定义模块根目录下创建 compile-kotlin.sh,用 kotlinc 编译 Kotlin 源码:
#!/bin/bash # 替换为你本地的 kotlinc 路径和 Kotlin 标准库路径 KOTLINC="/usr/local/bin/kotlinc" KOTLIN_STDLIB="/path/to/kotlin-stdlib-2.0.0.jar" # 创建 Kotlin 编译输出目录 mkdir -p build/classes/kotlin # 编译模块下所有 Kotlin 文件到指定目录 $KOTLINC src/main/kotlin/**/*.kt -cp $KOTLIN_STDLIB -d build/classes/kotlin
把你的 Kotlin 源码统一放在模块的 src/main/kotlin 目录,和 Java 源码的 src/main/java 分开,避免混淆。
2. 修改模块 Makefile 插入编译步骤
找到自定义模块的 Makefile(通常在模块根目录或 make 子目录),在原有 compile 目标前添加 Kotlin 编译依赖:
# 先编译 Kotlin 代码 compile-kotlin: ./compile-kotlin.sh # Java 编译依赖 Kotlin 编译完成 compile: compile-kotlin
这样执行 make 时会先编译 Kotlin 生成 class 文件,后续 Java 编译和模块打包就能识别到这些类。
3. 确保 module-info 与 Kotlin 包匹配
Kotlin 代码的包名必须和 module-info.java 中导出的包完全一致。比如你的 Kotlin 类在 com.my.custom 包下,module-info 要这样写:
module com.my.custom { exports com.my.custom; }
Kotlin 自动生成的合成类无需额外导出,只保证业务类的包正确即可。
二、将 Kotlin Runtime 整合进自定义 JDK
方式1:直接添加预编译 Kotlin Jar 包
- 下载与你使用的 Kotlin 版本匹配的核心 Jar 包(如
kotlin-stdlib.jar、kotlin-reflect.jar)。 - 在自定义模块的
lib/kotlin目录下存放这些 Jar 包。 - 修改模块 Makefile,将 Jar 包加入编译 classpath 并复制到最终 JDK 镜像:
# 把 Kotlin Runtime 加入模块编译依赖 MODULE_CLASSPATH += $(wildcard lib/kotlin/*.jar) # 构建镜像时复制 Kotlin Jar 到 JDK 的 jmods 目录 images: cp lib/kotlin/*.jar $(IMAGE_DIR)/jmods/
如果想更贴合 JDK 模块规范,可以用 jmod create 命令把 Kotlin Jar 打包成 jmod 文件,再放入 jmods 目录。
方式2:手动编译 Kotlin Runtime 源码
- 克隆对应版本的 Kotlin 源码(建议选 Kotlin 2.0+,适配 Java 24)。
- 用 Kotlin 官方构建系统编译出
stdlib等核心模块的 jmod 文件。 - 将编译好的 jmod 文件复制到自定义模块的
jmods目录,然后在module-info.java中添加依赖:
module com.my.custom { requires kotlin.stdlib; exports com.my.custom; }
三、修复“空包”检测问题
OpenJDK 构建系统在检查 module-info 时,默认只扫描 Java 编译生成的 class 文件。解决办法:
- 在模块 Makefile 中指定额外的 class 目录,让构建系统识别 Kotlin 编译的类:
# 把 Kotlin 编译输出目录加入模块 class 路径 MODULE_CLASSES += build/classes/kotlin
- 执行
make images前,先手动跑一遍./compile-kotlin.sh,确保 Kotlin class 文件已生成,再触发 OpenJDK 构建。
四、验证流程
- 单独执行
./compile-kotlin.sh,检查build/classes/kotlin下是否生成了正确的 class 文件。 - 运行
make compile,确认 Java 代码能正常引用 Kotlin 类,无编译错误。 - 执行
make images生成自定义 JDK,用java --list-modules检查自定义模块和 Kotlin 模块是否存在。 - 编写测试类引用自定义模块的 Kotlin 类,用自定义 JDK 运行,验证功能正常。
内容的提问来源于stack exchange,提问作者user22055505
相关产品推荐
相关产品推荐

