Kotlin+Maven打包Jar后运行提示找不到主类THEFILEKt的问题排查
解决Maven打包Kotlin/Java混合项目后运行Jar找不到主类的问题
我来帮你排查这个Error: Could not find or load main class THEFILEKt的问题,这个坑我之前也踩过,主要和Kotlin编译后的类名规则、Maven打包时的主类配置有关,咱们一步步拆解:
可能的原因
- Kotlin编译类名规则误解:Kotlin的顶级main函数(直接写在文件里、不属于任何类的main)编译后会自动生成带
Kt后缀的类,比如THEFILE.kt里的顶级main会变成THEFILEKt.class;但如果你的main函数是写在THEFILE类内部(比如用companion object包裹的@JvmStatic方法),那编译后的主类名就是THEFILE,这时候你指定THEFILEKt自然找不到。 - Maven打包主类配置错误/缺失:即使代码编译正常,如果Maven插件没把正确的主类写入Jar包的
MANIFEST.MF文件,运行时JVM找不到启动入口,就会报这个错。 - Kotlin源码目录未被正确识别:如果
kotlin-maven-plugin没配置src/main/kotlin为源码目录,Kotlin代码根本没被编译进Jar包,自然找不到主类文件。
具体解决方法
1. 先确认实际的主类名
去项目的target/classes目录下找编译后的.class文件:
- 如果看到
THEFILEKt.class,说明你的main是顶级函数,主类名就是THEFILEKt(如果有包名要加上,比如com.yourpackage.THEFILEKt); - 如果看到
THEFILE.class,说明main在类内部,主类名是THEFILE(同样要带上包名)。
2. 修正Maven的主类配置
修改pom.xml,确保打包时把正确的主类写入MANIFEST.MF,有两种常用方式:
方式一:通过kotlin-maven-plugin配置
<plugin> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-plugin</artifactId> <version>${kotlin.version}</version> <executions> <execution> <id>compile</id> <phase>compile</phase> <goals> <goal>compile</goal> </goals> <configuration> <!-- 替换成你实际的主类名,别忘了包名 --> <mainClass>THEFILEKt</mainClass> </configuration> </execution> <execution> <id>test-compile</id> <phase>test-compile</phase> <goals> <goal>test-compile</goal> </goals> </execution> </executions> </plugin>
方式二:通过maven-jar-plugin配置
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <configuration> <archive> <manifest> <!-- 替换成正确的主类名 --> <mainClass>THEFILEKt</mainClass> <addClasspath>true</addClasspath> </manifest> </archive> </configuration> </plugin>
3. 确保Kotlin源码目录被识别
如果你的pom.xml里还没明确配置Kotlin源码路径,一定要加上:
<build> <sourceDirectory>src/main/java</sourceDirectory> <testSourceDirectory>src/test/java</testSourceDirectory> <plugins> <plugin> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-plugin</artifactId> <version>${kotlin.version}</version> <executions> <execution> <id>compile</id> <phase>compile</phase> <goals> <goal>compile</goal> </goals> <configuration> <sourceDirs> <sourceDir>${project.basedir}/src/main/kotlin</sourceDir> <sourceDir>${project.basedir}/src/main/java</sourceDir> </sourceDirs> </configuration> </execution> <!-- 测试编译配置可以保留 --> </executions> </plugin> </plugins> </build>
4. 重新打包测试
执行mvn clean package后,去target目录找到你的Jar包,运行:
java -jar your-project-name.jar
如果还是有问题,可以解压Jar包,查看META-INF/MANIFEST.MF里的Main-Class属性是否正确,同时检查Jar内的class文件是否存在。
内容的提问来源于stack exchange,提问作者Deividas Duda
相关产品推荐
相关产品推荐

