【问题标题】:Ktor client NoSuchMethodErrorKtor 客户端 NoSuchMethodError
【发布时间】:2021-03-20 23:33:42
【问题描述】:

我想编写一个电报机器人并为此使用this library from Github。在这个电报机器人中,我需要向另一个服务发出一些请求,所以我想为此使用 ktor 客户端库。但是,当我尝试实例化 ktor httpClient 时,出现以下异常:

Exception in thread "main" java.lang.NoSuchMethodError: 'void io.ktor.util.collections.ConcurrentMap.<init>(io.ktor.util.Lock, int, int, kotlin.jvm.internal.DefaultConstructorMarker)'
at io.ktor.client.engine.cio.CIOEngine.<init>(CIOEngine.kt:32)
at io.ktor.client.engine.cio.CIO.create(CIOCommon.kt:23)
at io.ktor.client.HttpClientKt.HttpClient(HttpClient.kt:42)
at io.ktor.client.HttpClientJvmKt.HttpClient(HttpClientJvm.kt:21)
at io.ktor.client.HttpClientJvmKt.HttpClient$default(HttpClientJvm.kt)
at problem.ktor.MainKt.main(Main.kt:9)
at problem.ktor.MainKt.main(Main.kt)

我做了一个新项目并将问题缩小到电报机器人库,这显然与 kotr 库冲突。我假设 kotr 库有一些版本冲突,因为那是发生异常的地方。 我该如何解决冲突?

这是一个最小的可重现示例。使用以下 build.gradle.kts 文件:

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    application
    kotlin("jvm") version "1.4.30"
}

repositories {
    mavenCentral()
    maven(url = "https://jitpack.io")
}

dependencies {
    implementation("io.ktor:ktor-client-core:1.5.2")
    implementation("io.ktor:ktor-client-cio:1.5.2")
    implementation("com.github.kotlin-telegram-bot:kotlin-telegram-bot:6.0.4")
}

并运行以下最小主函数:

import io.ktor.client.*

fun main() {
    HttpClient()
}

也许这很重要,我使用的是 Java 15.0.2。

【问题讨论】:

  • 我已经检查了电报机器人库的 build.gradle。我没有在其中找到任何 ktor 依赖项。在示例中,他们使用的是 ktor。在 webhook 示例中,他们使用的是 ktor netty 1.2.6。如果我们在您的示例中使用该 ktor 版本,它就可以工作。仍然显示了一些依赖警告
  • @kaushik 使用旧的 ktor 版本会给我的项目带来其他问题。如果telegram bot库除了samples不使用ktor,你知道为什么同时使用两个库(ktor和telegram bot)会出现问题吗?
  • Ktor 和电报机器人正在使用不兼容的 kotlin 运行时版本。这可能是问题所在。
  • @kaushik 你怎么知道哪些版本不兼容?我看到图书馆有 kotlin v1.4.21 而我使用的是 v1.4.30,这似乎并没有那么大的区别。我不太清楚ktor的版本。但是这两个库本身都可以与我的 kotlin 版本一起使用,那么 v1.4.21 的一些错误是吗?
  • Aleksei Tirman 的回答很有效。电报机器人正在运送所有样本和图书馆。所以 ktor 1.2.6 也随库一起提供。排除它会解决您的问题。

标签: kotlin gradle telegram-bot ktor


【解决方案1】:

有问题的依赖是com.github.kotlin-telegram-bot.kotlin-telegram-bot:webhook:6.0.4。作为一种解决方法,您可以排除它,因为它只是一个示例:

implementation("com.github.kotlin-telegram-bot:kotlin-telegram-bot:6.0.4") {
    exclude(module = "webhook")
}

【讨论】:

  • 现在只有我检查过了,他们将所有样本与实际库捆绑在一起。我想知道为什么!
猜你喜欢
  • 1970-01-01
  • 2018-11-22
  • 2021-05-03
  • 2021-09-12
  • 2020-02-25
  • 2020-04-15
  • 2019-12-07
  • 1970-01-01
  • 2019-12-19
相关资源
最近更新 更多