如何配置Kotlin DSL实现Spring Boot多模块项目打包为可执行JAR文件
问题原因
你自定义的fatJar任务无法打入自有代码的核心原因是引入了Spring Boot插件后,默认jar任务的输出结构会被改写为Spring Boot可执行jar的特殊结构,类文件会被放到BOOT-INF/classes路径下,你直接通过with(tasks.jar.get() as CopySpec)无法获取到正常可被普通Jar任务识别的自有代码产物。同时你同时引入了Spring Boot打包能力、Shadow插件、自定义fatJar任务,多个打包逻辑冲突也会导致产物异常。
另外你重复配置了KotlinCompile任务参数,tasks.withType<KotlinCompile>已经覆盖了所有Kotlin编译场景,单独声明的compileKotlin配置属于冗余代码可以直接删除。
解决方案
你可以选择以下任意一种方案实现需求,不需要同时保留多套打包逻辑:
方案1:使用Spring Boot自带的bootJar任务(推荐)
Spring Boot官方插件已经内置了胖包打包能力,无需自定义任务或引入Shadow插件,你只需要做以下修改:
- 删除Shadow插件引入行:
id("com.github.johnrengelman.shadow") version "5.1.0" - 删除你自定义的
fatJar任务以及build依赖fatJar的配置 - 直接执行
./gradlew bootJar命令即可,产物会自动生成在build/libs目录下,默认已经包含所有依赖和你自己编写的代码,主类也会被自动识别无需手动配置。
方案2:使用Shadow插件打包
如果你确实需要用Shadow插件实现特殊的打包逻辑,也不需要自定义fatJar任务,修改配置如下:
- 删除你自定义的
fatJar任务以及build依赖fatJar的配置 - 新增Shadow任务配置:
tasks.withType<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar> { manifest { attributes["Main-Class"] = "com.example.MainApplicationKt" } mergeServiceFiles() // 用于合并Spring相关的服务配置文件,避免运行报错 }
- 执行
./gradlew shadowJar命令即可得到正确的胖包产物。
内容的提问来源于stack exchange,提问作者rainerosion
相关产品推荐
相关产品推荐

