运行使用外部库(带有 JVM 的 Kotlin)编译的 jar 文件时出现 ClassNotFoundException

问题描述 投票:0回答:1

这是我重现问题的步骤:

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 不是一个选项,我正在尝试构建一个快速工具来编译用户的代码)

java kotlin jar jvm
1个回答
0
投票

感谢@liaifat85给了我很大的提示,它解决了我的问题。

您可以尝试对两个 JAR 文件使用 -cp 选项并显式指定主类,而不是使用 -jar 选项。

java -cp Library.jar:MyCode.jar MyCodeKt
© www.soinside.com 2019 - 2024. All rights reserved.