我想编译一个带有依赖项/导入的kotlin文件
package_a.kt
// file: package_a.kt
package package_a
fun function_from_package_a(){
println(" hurray function_from_package_a was called ! ")
}main.kt
// file: main.kt
import package_a.*
fun main() {
function_from_package_a();
println("main function was executed")
}编译正在与
$ kotlinc package_a.kt -d package_a.jar
$ kotlinc main.kt -classpath package_a.jar -d main.jar但是,当我使用java运行main.jar时,我会得到一个错误:
$ java -jar main.jar
Exception in thread "main" java.lang.NoClassDefFoundError: package_a/Package_aKt
at MainKt.main(main.kt:8)
at MainKt.main(main.kt)
Caused by: java.lang.ClassNotFoundException: package_a.Package_aKt
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
... 2 more有人知道为什么吗?
发布于 2022-01-16 02:45:16
使用以下命令编译主类时:
kotlinc main.kt -classpath package_a.jar -d main.jar生成的main.jar只包含主类对象。它不包含package_a包中的对象。-classpath选项到kotlinc只允许在编译期间解析符号。它不会导致结果main.jar文件中包含任何其他内容。
因此,当您执行:
java -jar main.jarJava不知道从哪里获取package_a包的内容。
然后,您可能会认为这样做是可行的:
java -classpath package_a.jar -jar main.jar但是这也不起作用,因为当您指定Java执行jar文件时,所有查找依赖对象的指令,无论是jar文件还是其他地方,都必须来自jar文件本身。当使用-classpath选项时,将忽略-jar选项。
更新:我看到行动部只在发布了我自己的答案后才发帖。运行代码的另一种方式可以工作,因为没有使用-jar选项,因此没有忽略-classpath选项,因此指定的命令告诉Java要执行什么,并告诉它在哪里查找所有必要的类文件。
注意:不需要对原始源文件进行任何更改。主类不需要在命名包中才能在命令行上引用它。该命令将以其原始形式执行代码:
java -cp main.jar:package_a.jar MainKt另一个选项是将依赖的包包含在main.jar文件中。我试过了,效果很好。这涉及到一些问题,因为您必须获得正确的清单,以便Java知道要执行哪个类。因为OP找到了另一种方法,我不会在这里详述。
发布于 2022-01-16 02:40:05
我找到了解决这个问题的办法
我把我的main.kt改为
// file: main.kt
package test
import package_a.*
fun main() {
function_from_package_a();
println("main function was executed")
}然后我就可以用
java -cp main.jar:package_a.jar test.MainKthttps://stackoverflow.com/questions/70726114
复制相似问题