如何配置Gradle项目使其依赖Kotlin项目生成的JS代码
解决方案:将Kotlin多平台JS产物打包进Spring Boot可分发Jar包
前置说明
你的场景基于Gradle多项目构建,公共逻辑为同时支持JVM、JS目标的Kotlin多平台模块,Spring Boot服务端默认仅依赖该模块的JVM编译产物,需要额外配置拉取JS产物并打入最终的可执行Jar。
配置步骤
1. 调整Kotlin公共模块配置,生成可被依赖的JS构件
在公共Kotlin模块的build.gradle.kts中新增JS产物打包任务,并将其加入发布构件列表:
kotlin { // 保留原有JVM目标配置 jvm() // 保留原有JS目标配置,示例为浏览器端IR编译器 js(IR) { browser() binaries.executable() } // 保留原有sourceSets配置 } // 注册JS产物打包任务 val jsJar by tasks.registering(Jar::class) { group = "build" archiveClassifier.set("js") // 从JS生产构建的输出目录取产物 from(tasks.named("jsBrowserProductionWebpack")) // 指定JS产物在Jar内的路径,放到static目录下Spring可直接作为静态资源分发 into("static/kotlin-shared") } // 将JS Jar加入模块的构件列表,可供其他项目依赖 artifacts { archives(jsJar) }
如果使用Groovy DSL编写Gradle脚本,对应调整语法即可。
2. 调整Spring Boot服务端模块依赖配置
在服务端模块的build.gradle.kts的依赖块中,新增对公共模块JS构件的依赖:
dependencies { // 保留原有对公共模块JVM版本的依赖 implementation(project(":你的公共Kotlin模块名")) // 新增运行时依赖公共模块的JS构件 runtimeOnly(project(":你的公共Kotlin模块名", "js")) }
3. 验证配置
执行服务端的bootJar任务,解压生成的可执行Jar:
- 检查
BOOT-INF/lib目录下是否存在[公共模块名]-[版本号]-js.jar文件 - 直接启动服务,访问
http://你的服务地址/kotlin-shared/[JS文件名].js即可获取到编译后的公共逻辑JS代码
备选轻量方案(无需单独打包JS Jar)
如果你的公共模块不需要单独对外发布,也可以直接在服务端的资源处理任务中直接拷贝公共模块的JS构建产物:
// 写在服务端模块的build.gradle.kts中 tasks.processResources { // 先执行公共模块的JS生产构建 dependsOn(":你的公共Kotlin模块名:jsBrowserProductionWebpack") // 拷贝构建产物到服务端的静态资源目录 from(file("${project(":你的公共Kotlin模块名").buildDir}/dist/js/productionExecutable")) { into("static/kotlin-shared") } }
该方案不会生成独立的JS Jar,产物会直接打入服务端Jar的BOOT-INF/classes/static目录下。
内容的提问来源于stack exchange,提问作者Konstantin Tarashchanskiy
相关产品推荐
相关产品推荐

