You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

KMM模块运行main函数报ClassNotFoundException(MainKt)求助

问题:KMM模块无法运行main函数,无运行按钮且run任务报错

我通过「New Project -> Kotlin Multiplatform -> Library」创建新项目,删除根项目自动生成的源码树后新增了名为kmm的模块。现在遇到两个问题:

  1. main函数旁边没有运行按钮
  2. 执行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也无法检测到可运行入口。按以下步骤修改:

  1. 将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")
// }
  1. 确认源码目录结构合规
    KMM模块需遵循多平台源码目录规范:
  • 共享代码:src/commonMain/kotlin/
  • JVM专属代码:src/jvmMain/kotlin/
    确保你的Main.kt放在src/commonMain/kotlin/com/github/shalva97/或src/jvmMain/kotlin/com/github/shalva97/路径下。
  1. 重新同步并运行
  • 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 08:05:34