这是我重现问题的步骤:
com/example/Library.kt
package com.example
class Library {
fun getValue(): Int {
return 123
}
}
我的代码.kt
import com.example.Library
fun main() {
println("Hello World")
println(Library().getValue())
}
我可以使用下面的命令编译这两个文件,没有任何错误:
kotlinc com/example/Library.kt -d Library.jar
kotlinc -cp Library.jar MyCode.kt -d MyCode.jar
编译后的文件结构:
$ tree
.
├── Library.jar
├── MyCode.jar
├── MyCode.kt
└── com
└── example
└── Library.kt
但是,我无法执行MyCode.jar
$ java -cp Library.jar -jar MyCode.jar
Hello world
Exception in thread "main" java.lang.NoClassDefFoundError: com/example/Library
at MyCodeKt.main(MyCode.kt:5)
at MyCodeKt.main(MyCode.kt)
Caused by: java.lang.ClassNotFoundException: com.example.Library
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
... 2 more
使用 kotlin 而不是 java 都不起作用:
$ kotlin -cp Library.jar MyCode.jar
Hello world
Exception in thread "main" java.lang.NoClassDefFoundError: com/example/Library
at MyCodeKt.main(MyCode.kt:5)
at MyCodeKt.main(MyCode.kt)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.jetbrains.kotlin.runner.AbstractRunner.run(runners.kt:70)
at org.jetbrains.kotlin.runner.Main.run(Main.kt:194)
at org.jetbrains.kotlin.runner.Main.main(Main.kt:204)
Caused by: java.lang.ClassNotFoundException: com.example.Library
at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:445)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:593)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
... 7 more
谁能告诉我这里出了什么问题吗?
(Maven / Gradle 不是一个选项,我正在尝试构建一个快速工具来编译用户的代码)
感谢@liaifat85给了我很大的提示,它解决了我的问题。
您可以尝试对两个 JAR 文件使用 -cp 选项并显式指定主类,而不是使用 -jar 选项。
java -cp Library.jar:MyCode.jar MyCodeKt