You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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 包

  1. 下载与你使用的 Kotlin 版本匹配的核心 Jar 包(如 kotlin-stdlib.jar、kotlin-reflect.jar)。
  2. 在自定义模块的 lib/kotlin 目录下存放这些 Jar 包。
  3. 修改模块 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 源码

  1. 克隆对应版本的 Kotlin 源码(建议选 Kotlin 2.0+,适配 Java 24)。
  2. 用 Kotlin 官方构建系统编译出 stdlib 等核心模块的 jmod 文件。
  3. 将编译好的 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 构建。

四、验证流程

  1. 单独执行 ./compile-kotlin.sh,检查 build/classes/kotlin 下是否生成了正确的 class 文件。
  2. 运行 make compile,确认 Java 代码能正常引用 Kotlin 类,无编译错误。
  3. 执行 make images 生成自定义 JDK,用 java --list-modules 检查自定义模块和 Kotlin 模块是否存在。
  4. 编写测试类引用自定义模块的 Kotlin 类,用自定义 JDK 运行,验证功能正常。

内容的提问来源于stack exchange,提问作者user22055505

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 10:28:09