如何用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
相关产品推荐
相关产品推荐

