运行含外部依赖的Kotlin-JVM编译Jar时触发ClassNotFoundException
问题原因分析与解决方案
核心问题
运行时触发ClassNotFoundException的本质原因有两点:
- 使用
java -jar时,命令行指定的-cp参数会被直接忽略,JVM仅读取目标jar包MANIFEST.MF中配置的Class-Path和Main-Class,而你的MyCode.jar未配置这两项,既找不到主入口类,也无法定位依赖的Library类。 - 使用
kotlin命令运行时,你仅将Library.jar加入类路径,未包含MyCode.jar,导致JVM找不到主类;同时也未明确指定主类的全限定名。
额外注意:Kotlin会将默认包下的顶层main函数编译为[文件名]Kt格式的类(此处是MyCodeKt),这是运行时必须指定的主类名。
解决方案
方案1:编译生成可执行jar(推荐)
重新编译MyCode.jar时,指定主类并添加依赖路径到MANIFEST.MF:
- 确保
Library.jar编译正常:
kotlinc com/example/Library.kt -d Library.jar
- 编译
MyCode.jar,指定主类和依赖:
# Linux/macOS kotlinc -cp Library.jar MyCode.kt -d MyCode.jar -main MyCodeKt -manifest "Class-Path: Library.jar" # Windows(Class-Path配置语法一致) kotlinc -cp Library.jar MyCode.kt -d MyCode.jar -main MyCodeKt -manifest "Class-Path: Library.jar"
- 直接运行:
java -jar MyCode.jar
方案2:不重新编译,直接正确运行
将两个jar都加入类路径,同时指定主类全限定名:
Linux/macOS
# Java命令 java -cp "MyCode.jar:Library.jar" MyCodeKt # Kotlin命令 kotlin -cp "MyCode.jar:Library.jar" MyCodeKt
Windows
# Java命令 java -cp "MyCode.jar;Library.jar" MyCodeKt # Kotlin命令 kotlin -cp "MyCode.jar;Library.jar" MyCodeKt
内容的提问来源于stack exchange,提问作者Plus
相关产品推荐
相关产品推荐

