Ktor应用打包fatJar/ShadowJar未包含资源目录问题求助
Ktor FatJar 不包含resources目录的解决方法
问题
开发Ktor应用时,尝试用Ktor内置的fatJar任务或Shadow插件的shadowJar任务打包fatJar,但生成的Jar包里完全找不到resources目录的资源文件,用7zip查看也看不到相关内容。
当前build.gradle.kts配置:
val ktor_version: String by project val kotlin_version: String by project val logback_version: String by project plugins { kotlin("jvm") version "1.9.24" id("io.ktor.plugin") version "2.3.11" id("com.github.johnrengelman.shadow") version "8.1.1" } group = "dev.bluemethyst.web" version = "0.0.2" application { mainClass.set("dev.bluemethyst.kassword.ApplicationKt") val isDevelopment: Boolean = project.ext.has("development") applicationDefaultJvmArgs = listOf("-Dio.ktor.development=$isDevelopment") } repositories { mavenCentral() } dependencies { implementation("io.ktor:ktor-server-core:$ktor_version") implementation("io.ktor:ktor-server-netty:$ktor_version") implementation("io.ktor:ktor-client-core:$ktor_version") implementation("io.ktor:ktor-client-apache:$ktor_version") implementation("ch.qos.logback:logback-classic:$logback_version") implementation("com.google.code.gson:gson:2.11.0") } ktor { fatJar { archiveFileName.set("fat.jar") } } sourceSets { main { resources { srcDir("src/main/resources") include("**/*") include("static/html/*") } } }
解决方法
问题出在sourceSets的资源配置上:
- 移除冗余的资源目录配置:Gradle默认已经将
src/main/resources识别为main源码集的资源目录,重复设置srcDir("src/main/resources")会干扰默认逻辑,导致资源未被正确打包。 - 简化include规则:
include("**/*")已经包含所有资源文件,额外的include("static/html/*")属于重复配置,无需保留。
你可以直接删除整个sourceSets块(默认配置已满足需求),或者修改为以下简化版本:
sourceSets { main { resources { include("**/*") } } }
验证步骤
- 执行
./gradlew clean processResources,检查build/resources/main目录下是否存在你的资源文件,确认资源被正确处理。 - 执行打包任务:
./gradlew clean fatJar(Ktor内置任务)或./gradlew clean shadowJar(Shadow插件任务)。 - 打开
build/libs下生成的Jar包,确认resources目录的文件已被包含。
内容的提问来源于stack exchange,提问作者Caleb
相关产品推荐
相关产品推荐

