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

如何用maven-assembly-plugin将Kotlin无显式主类代码打包为可执行jar

解决方案

问题原因

Kotlin 编译器对顶层函数的编译规则为:同一.kt文件内的所有顶层声明(函数、属性)会被编译为一个独立的Java类,类名固定为「当前Kt文件名 + Kt」后缀。
你之前将main放在MyApplication类的伴生对象中,主类是com.my.application.MyApplication;改为顶层main后,若main定义在MyApplication.kt文件中,实际生成的主类全限定名为com.my.application.MyApplicationKt,原配置的主类不存在因此抛出异常。

配置方法

两种方案二选一即可:

方案1:直接修改pom中的主类配置

将maven-assembly-plugin(以及maven-jar-plugin若有配置主类)中的mainClass值改为带Kt后缀的类名即可。
完整配置示例:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>3.6.0</version>
    <configuration>
        <archive>
            <manifest>
                <!-- 替换为带Kt后缀的实际生成主类名 -->
                <mainClass>com.my.application.MyApplicationKt</mainClass>
            </manifest>
        </archive>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

注意:如果你的顶层main函数所在的Kotlin文件名不是MyApplication.kt,请将上述配置中的类名替换为「你的文件名 + Kt」即可
修改后重新执行mvn clean package即可正常运行。

方案2:自定义编译后的主类名(无需修改pom配置)

如果不想改动pom中的原有主类配置,可以在定义顶层main函数的Kotlin文件头部添加@file:JvmName注解,指定编译后的类名:

// 放在MyApplication.kt文件的第一行,包声明之前
@file:JvmName("MyApplication")
package com.my.application

fun main(args: Array<String>) {
    // 你的业务逻辑
}

此时Kotlin编译器会将该文件的顶层声明编译为MyApplication类,和原来的主类名完全一致,无需修改pom配置即可正常打包运行。

内容的提问来源于stack exchange,提问作者Saffie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:24:03