Kotlin项目打JAR包:主类找不到及NoClassDefFoundError问题求助
Kotlin应用打包问题解决方案
1. 解决Manifest无Main-Class属性&Artifact找不到主类问题
- 确认主类全路径正确:如果
Main.kt不在根包下,必须填写完整包名(例如com.yourpackage.MainKt),而非仅MainKt。 - 修正Gradle的Manifest配置:
application.mainClass是Property<String>类型,直接赋值会导致Manifest写入Provider(value=MainKt)而非实际类名,需调用get()获取真实值:jar { manifest { attributes["Main-Class"] = application.mainClass.get() } // 其他配置保留 } - 同步Gradle并重新生成Artifact:在IDEA中执行
File → Sync Project with Gradle Files,重新配置Artifact时主类会被正确识别。
2. 解决java.lang.NoClassDefFoundError: kotlinx/coroutines/slf4j/MDCContext错误
该错误是缺少kotlinx-coroutines-slf4j依赖导致的,在dependencies块中添加对应版本依赖(版本需与Kotlin版本匹配,Kotlin 1.5.10对应coroutines 1.5.0):
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-slf4j:1.5.0")
3. 优化Gradle打包配置(消除重复&确保Fat Jar构建正确)
你的配置存在重复的compileKotlin设置,且手动构建Fat Jar可能遗漏依赖,建议调整为如下完整配置:
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { kotlin("jvm") version "1.5.10" application kotlin("plugin.serialization") version "1.6.10" } version = "1.0-SNAPSHOT" repositories { mavenCentral() maven(url = "https://jitpack.io") } val ktor_version: String by project val coroutines_version = "1.5.0" // 与Kotlin版本匹配 dependencies { // Fix HTML issue on some responses implementation("org.apache.commons:commons-text:1.10.0") // Ktor dependencies implementation("io.ktor:ktor-client-auth:$ktor_version") implementation("io.ktor:ktor-client-core:$ktor_version") implementation("io.ktor:ktor-client-cio:$ktor_version") implementation("io.ktor:ktor-client-resources:$ktor_version") implementation("io.ktor:ktor-serialization-kotlinx-json:$ktor_version") implementation("io.ktor:ktor-client-content-negotiation:$ktor_version") implementation("io.ktor:ktor-client-logging:$ktor_version") // Logging dependencies implementation("ch.qos.logback:logback-classic:1.4.0") // 添加缺失的coroutines-slf4j依赖 implementation("org.jetbrains.kotlinx:kotlinx-coroutines-slf4j:$coroutines_version") implementation(kotlin("stdlib-jdk8")) // Database implementation("mysql:mysql-connector-java:8.0.30") implementation("org.ktorm:ktorm-core:3.5.0") implementation("org.ktorm:ktorm-support-mysql:3.5.0") } application { // 替换为你的主类完整包名 mainClass.set("MainKt") } // 统一设置Kotlin编译JVM目标,消除重复配置 tasks.withType<KotlinCompile> { kotlinOptions.jvmTarget = "1.8" } tasks.jar { manifest { attributes["Main-Class"] = application.mainClass.get() } duplicatesStrategy = DuplicatesStrategy.EXCLUDE // 使用runtimeClasspath确保包含所有运行时依赖 from(configurations.runtimeClasspath.get().map { if (it.isDirectory) it else zipTree(it) }) }
验证步骤
- 执行
./gradlew clean jar构建Fat Jar; - 运行Jar包:
java -jar build/libs/你的项目名-1.0-SNAPSHOT.jar; - 若仍有问题,检查主类是否存在、包名是否正确,以及依赖是否全部引入。
内容的提问来源于stack exchange,提问作者Poui
相关产品推荐
相关产品推荐

