如何将多模块KMP库的源码合并为单个源码Jar包?
解决KMP多模块合并Jar的问题
直接通过Gradle插件或手动配置Jar任务就能解决,分两种场景说明:
场景1:合并编译后的字节码到一个Jar
- 引入Shadow插件
在第一个库的build.gradle.kts的plugins块中添加:
plugins { kotlin("multiplatform") id("com.github.johnrengelman.shadow") version "8.1.1" // 可替换为最新稳定版 }
- 配置ShadowJar任务
添加以下配置,指定打包时包含第二个模块的代码:
tasks.withType<ShadowJar> { // 包含目标依赖模块 dependencies { include(project(":second_kpm_lib")) } // 自定义Jar文件名(可选) archiveFileName.set("combined-kmp-lib.jar") // 处理重复服务文件,避免打包冲突(可选) mergeServiceFiles() // 明确基于JVM编译产物打包(KMP需指定目标平台) from(tasks.named("jvmMainClasses")) }
- 执行打包命令
运行./gradlew :first_kpm_lib:shadowJar,生成的合并Jar会在first_kpm_lib/build/libs/目录下。
场景2:合并源码到一个源码Jar
如果需要把两个模块的源码打包成一个sources Jar,配置jvmSourcesJar任务即可:
tasks.named<Jar>("jvmSourcesJar") { // 引入第二个模块的源码Jar内容 from(project(":second_kpm_lib").tasks.named<Jar>("jvmSourcesJar").map { it.outputs.files }) // 自定义源码Jar文件名(可选) archiveFileName.set("combined-kmp-lib-sources.jar") }
运行./gradlew :first_kpm_lib:jvmSourcesJar即可生成合并后的源码Jar。
注意事项
- 确保两个KMP模块的JVM目标配置一致,避免编译冲突
- 若不想用Shadow插件,也可直接给
jvmJar任务添加from配置引入第二个模块的jvmJar产物,但Shadow插件更适合处理复杂依赖合并场景
内容的提问来源于stack exchange,提问作者admund
相关产品推荐
相关产品推荐

