【问题标题】:Shaddow Jar missing some Vert.x classes from dependeciesShadow Jar 缺少依赖项中的一些 Vert.x 类
【发布时间】:2020-03-25 22:39:19
【问题描述】:

我已经使用 Kotlin 协程扩展成功创建了一个带有少量 verticles 的 shadow-jar,并且能够通过 vertx run 命令行运行它们,同时指定我的 jar 的路径,除了在其启动时创建一个 telnet shell 的 Verticle例外:

java.lang.NoClassDefFoundError: io.vertx.ext.shell.term.TelnetTermOptions
    at io.vertx.kotlin.ext.shell.term.TelnetTermOptionsKt.telnetTermOptionsOf(TelnetTermOptions.kt:119)
    at io.vertx.kotlin.ext.shell.term.TelnetTermOptionsKt.telnetTermOptionsOf$default(TelnetTermOptions.kt:119)
    at **********************.ContactsReceiver.start(ContactsReceiver.kt:20)
    at io.vertx.kotlin.coroutines.CoroutineVerticle$start$1.invokeSuspend(CoroutineVerticle.kt:53)
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
    at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:238)
    at io.vertx.kotlin.coroutines.VertxCoroutineExecutor.execute(VertxCoroutine.kt:214)
    at kotlinx.coroutines.ExecutorCoroutineDispatcherBase.dispatch(Executors.kt:64)
    at kotlinx.coroutines.DispatchedKt.resumeCancellable(Dispatched.kt:413)
    at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:25)
    at kotlinx.coroutines.CoroutineStart.invoke(CoroutineStart.kt:109)
    at kotlinx.coroutines.AbstractCoroutine.start(AbstractCoroutine.kt:154)
    at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch(Builders.common.kt:54)
    at kotlinx.coroutines.BuildersKt.launch(Unknown Source)
    at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch$default(Builders.common.kt:47)
    at kotlinx.coroutines.BuildersKt.launch$default(Unknown Source)
    at io.vertx.kotlin.coroutines.CoroutineVerticle.start(CoroutineVerticle.kt:51)
    at io.vertx.core.Verticle.start(Verticle.java:66)
    at io.vertx.core.impl.DeploymentManager.lambda$doDeploy$8(DeploymentManager.java:556)
    at io.vertx.core.impl.DeploymentManager$$Lambda$126.0000000063922220.handle(Unknown Source)
    at io.vertx.core.impl.ContextImpl.executeTask(ContextImpl.java:369)
    at io.vertx.core.impl.EventLoopContext.lambda$executeAsync$0(EventLoopContext.java:38)
    at io.vertx.core.impl.EventLoopContext$$Lambda$127.0000000060DA8B00.run(Unknown Source)
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163)
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:510)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:518)
    at io.netty.util.concurrent.SingleThreadEventExecutor$6.run(SingleThreadEventExecutor.java:1044)
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.base/java.lang.Thread.run(Thread.java:831)

我的项目是使用 Gradle (Kotlin DSL) 构建的

这些是我的 vert.x 依赖项:

io.vertx:vertx-core
io.vertx:vertx-lang-kotlin
io.vertx:vertx-lang-kotlin-coroutines
io.vertx:vertx-shell
io.vertx:vertx-auth-shiro
io.vertx:vertx-tcp-eventbus-bridge

我的影子 jar 任务配置如下:

tasks.withType<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar> {
    classifier = "fat"
    isPreserveFileTimestamps = false
    isReproducibleFileOrder = true
    minimize()
    manifest {
        attributes["Main-Verticle"] = vertx.mainVerticle
    }
    mergeServiceFiles {
        include("META-INF/services/io.vertx.core.spi.VerticleFactory")
    }
}

似乎minimize() 不是问题,但重要的是,如果我从main 函数以编程方式部署该verticle,一切都可以正常工作并且我得到了telnet shell。

也许我在影子 jar 任务的清单配置中遗漏了一些东西?

【问题讨论】:

  • 我有一个类似的问题,因为最小化 jar 将只包含可以在编译时从树解析的类。如果在运行时调用某些类,它们可能会丢失。这就是为什么我有一个过滤器,它显式地打包了一些 vertx 依赖项中的所有类。你能在没有最小化 jar 选项的情况下仔细检查一下,看看它是否有效。
  • 我试过没有minimize(),结果没有变化。您能否详细说明一下 jar 选项和/或您的显式文件过滤器?也许它可以帮助我。

标签: kotlin vert.x gradle-kotlin-dsl shadowjar


【解决方案1】:

我在 HoconProcessor (here) 上遇到了类似的问题,但同时更相关的是 GraphiQLHandlerOptions 类,我导入了一个已弃用的版本 (look),导致该类以相同的名称包含在 jar 中,但它的使用预期会抛出 java.lang.NoClassDefFoundError

由于TelnetTermOptions 也是这样一个选项类,它最近可能遭受了类似的弃用。希望这会有所帮助/启发。

【讨论】:

    猜你喜欢
    • 2019-04-14
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 2017-12-25
    • 2015-04-18
    相关资源
    最近更新 更多