KMM模块运行main函数报ClassNotFoundException(MainKt)求助
问题:KMM模块无法运行main函数,无运行按钮且run任务报错
我通过「New Project -> Kotlin Multiplatform -> Library」创建新项目,删除根项目自动生成的源码树后新增了名为kmm的模块。现在遇到两个问题:
- main函数旁边没有运行按钮
- 执行application插件的
run任务时,出现找不到主类的报错:
> Task :wrapper BUILD SUCCESSFUL in 1s 1 actionable task: 1 executed > Task :kmm:compileJava NO-SOURCE > Task :kmm:processResources NO-SOURCE > Task :kmm:classes UP-TO-DATE > Task :kmm:run FAILED 1 actionable task: 1 executed Error: Could not find or load main class com.github.shalva97.MainKt Caused by: java.lang.ClassNotFoundException: com.github.shalva97.MainKt FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':kmm:run'. > Process 'command 'C:\Program Files\AdoptOpenJDK\jdk-11.0.11.9-hotspot\bin\java.exe'' finished with non-zero exit value 1 * Try: > Run with --stacktrace option to get the stack trace. > Run with --info or --debug option to get more log output. > Run with --scan to get full insights. * Get more help at https://help.gradle.org BUILD FAILED in 256ms 11:02:41 PM: Execution finished 'run'.
相关配置文件
根项目Gradle配置(build.gradle.kts)
group = "org.example" version = "1.0-SNAPSHOT" repositories { mavenCentral() }
kmm模块Gradle配置(build.gradle.kts)
plugins { kotlin("multiplatform") version "1.8.0-Beta" application } repositories { mavenCentral() } dependencies { testImplementation("org.junit.jupiter:junit-jupiter-api:5.8.1") testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.8.1") } tasks.getByName<Test>("test") { useJUnitPlatform() } tasks.test { useJUnitPlatform() } kotlin { jvm() linuxArm64() sourceSets { val commonMain by getting } } application { mainClass.set("com.github.shalva97.MainKt") }
Main.kt代码
package com.github.shalva97 fun main() { println(5.factorial()) } fun Number.factorial(): Long { return (1..this.toLong()).fold(1) { i: Long, l: Long -> return l * i } }
settings.gradle.kts配置
rootProject.name = "Willians" include("kmm")
解决方法
问题核心是application插件与Kotlin Multiplatform的JVM目标未正确关联,导致编译后的主类未被识别,IDE也无法检测到可运行入口。按以下步骤修改:
- 将application插件绑定到Kotlin JVM目标
在kmm模块的build.gradle.kts中,把主类配置移到kotlin的jvm目标块内,并添加withJava()关联插件:
kotlin { jvm { withJava() // 关联application插件与JVM目标 mainClass.set("com.github.shalva97.MainKt") // 指定主类 } linuxArm64() sourceSets { val commonMain by getting } } // 移除原来单独的application块 // application { // mainClass.set("com.github.shalva97.MainKt") // }
- 确认源码目录结构合规
KMM模块需遵循多平台源码目录规范:
- 共享代码:
src/commonMain/kotlin/ - JVM专属代码:
src/jvmMain/kotlin/
确保你的Main.kt放在src/commonMain/kotlin/com/github/shalva97/或src/jvmMain/kotlin/com/github/shalva97/路径下。
- 重新同步并运行
- 在IDE中点击「Sync Project with Gradle Files」
- 此时main函数旁会出现运行按钮;命令行执行
gradlew :kmm:run(Windows)或./gradlew :kmm:run(Mac/Linux)即可运行。
额外建议:将Kotlin版本从1.8.0-Beta替换为稳定版(如1.9.x),避免测试版本的兼容性问题。
内容的提问来源于stack exchange,提问作者George Shalvashvili
相关产品推荐
相关产品推荐

