【发布时间】: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