如何将Kotlin多平台项目作为Jar模块依赖添加(无需手动移动)
问题说明
在Kotlin多平台项目中,当通过implementation(project(":sevenzipJavm"))依赖另一个KMP模块时,目标模块jvmMain目录下的资源不会被添加到类路径,导致无法访问;但直接依赖该模块构建出的Jar包就能正常读取资源。如果直接引用项目内构建的Jar(如files("../sevenzipJavm/build/libs/sevenzipJavm-jvm.jar")),Gradle会优先使用build/classes下的编译产物,只有把Jar移出项目目录才能生效,操作非常繁琐。
可行的临时解决方案
以下几种方式可以自动依赖模块的Jar产物,无需手动移动文件:
1. 直接依赖模块的Jar构建任务输出
在主项目的build.gradle.kts中,配置依赖指向目标模块的jvmJar任务输出,确保Gradle优先使用Jar包而非编译类文件:
implementation(project(":sevenzipJavm").tasks.named("jvmJar").map { it.outputs.files })
配置后,每次构建主项目时,Gradle会自动先执行sevenzipJavm模块的jvmJar任务,然后使用生成的Jar包,无需手动干预。
2. 本地Maven发布依赖(适合频繁迭代场景)
在sevenzipJavm模块的build.gradle.kts中添加本地Maven发布配置:
plugins { `maven-publish` } publishing { publications { create<MavenPublication>("jvm") { from(components["jvm"]) } } repositories { mavenLocal() } }
执行命令./gradlew publishToMavenLocal将模块Jar发布到本地Maven仓库,之后在主项目中依赖本地仓库的包:
implementation("你的项目groupId:sevenzipJavm:自定义版本号")
后续修改模块代码后,只需重新执行发布命令即可更新依赖,无需移动Jar。
3. 排除编译类产物并关联Jar构建任务
在主项目中配置依赖时,排除模块的编译类输出,同时让构建任务依赖目标模块的Jar生成任务:
implementation(project(":sevenzipJavm")) { exclude(module = "sevenzipJavm-jvm") } implementation(files("../sevenzipJavm/build/libs/sevenzipJavm-jvm.jar")) // 确保构建主项目前先构建目标模块的Jar tasks.withType<JavaCompile> { dependsOn(project(":sevenzipJavm").tasks.named("jvmJar")) }
这种方式需要确保模块的Jar输出路径正确,适合临时快速验证场景。
注意事项
以上方案均为该Kotlin多平台资源类路径问题的临时 workaround,待官方修复后,可恢复正常的模块依赖方式。
内容的提问来源于stack exchange,提问作者Cyber Avater

