【问题标题】:loading a jar file at runtime java.lang.NoClassDefFoundError: kotlin/jvm/internal/markers/KMappedMarker在运行时加载 jar 文件 java.lang.NoClassDefFoundError: kotlin/jvm/internal/markers/KMappedMarker
【发布时间】:2021-04-16 20:25:25
【问题描述】:

我有包含Foofoo.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-stdlibkotlin-reflect,但我仍然遇到同样的错误。

谁能解释一下这是怎么回事?

【问题讨论】:

    标签: kotlin plugins jar runtime classloader


    【解决方案1】:

    对于任何感兴趣的人,我最终通过更改使其工作:

    val cl = URLClassLoader.newInstance(urls)
    

    到这里:

    val cl = URLClassLoader.newInstance(urls, this::class.java.classLoader)
    

    不需要 fat-jar 也不需要额外的 -cp 选项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-20
      • 2012-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      • 2012-10-20
      相关资源
      最近更新 更多