【发布时间】:2021-04-16 20:25:25
【问题描述】:
我有包含Foo 的foo.jar:
class Foo: Bar { ... }
bar.jar 包含 Bar:
abstract class Bar { ... }
然后我有 baz.jar 动态加载 Foo:
val jarFile = JarFile("./foo.jar")
val e: Enumeration<JarEntry> = jarFile.entries()
val urls = arrayOf(URL("jar:file:foo.jar!/"))
val cl = URLClassLoader.newInstance(urls)
Thread.currentThread().contextClassLoader = cl // With or without same result.
val list = mutableListOf<Class<*>>()
while (e.hasMoreElements()) {
val je: JarEntry = e.nextElement()
...
cl.loadClass(className)
并按如下方式运行:
java -cp ./bar.jar -jar ./baz.jar
首先,我很困惑,即使bar.jar 在类路径中,我也会收到“ClassNotFoundException”。
我通过在./foo.jar 之前动态加载./bar.jar 来解决这个问题,如上面的代码所示。
那么现在我得到NoClassDefFoundError: kotlin/jvm/internal/markers/KMappedMarker
kotlin 运行时已经打包在foo.jar 中。
jar -xvf foo/build/libs/foo-1.0.jar | grep std
extracted: BOOT-INF/lib/kotlin-stdlib-1.4.10.jar
我还为bar.jar 创建了一个胖罐,因此它包含kotlin-stdlib 和kotlin-reflect,但我仍然遇到同样的错误。
谁能解释一下这是怎么回事?
【问题讨论】:
标签: kotlin plugins jar runtime classloader