我正在为 IntelliJ Idea 开发一个插件 我想用Ktor Client来使用
websocket
功能
val client = HttpClient(CIO) {
install(WebSockets)
}
当我发送 websocket 请求时
client.webSocket(...)
这个异常会被抛出
java.lang.LinkageError: loader constraint violation: when resolving method 'org.slf4j.ILoggerFactory org.slf4j.impl.StaticLoggerBinder.getLoggerFactory()' the class loader com.intellij.ide.plugins.cl.PluginClassLoader @a02df19 of the current class, org/slf4j/LoggerFactory, and the class loader com.intellij.util.lang.PathClassLoader @2ac1fdc4 for the method's defining class, org/slf4j/impl/StaticLoggerBinder, have different Class objects for the type org/slf4j/ILoggerFactory used in the signature (org.slf4j.LoggerFactory is in unnamed module of loader com.intellij.ide.plugins.cl.PluginClassLoader @a02df19, parent loader 'bootstrap'; org.slf4j.impl.StaticLoggerBinder is in unnamed module of loader com.intellij.util.lang.PathClassLoader @2ac1fdc4)
at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:423)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:362)
at io.ktor.util.logging.KtorSimpleLoggerJvmKt.KtorSimpleLogger(KtorSimpleLoggerJvm.kt:10)
at io.ktor.client.plugins.websocket.WebSocketsKt.<clinit>(WebSockets.kt:22)
at io.ktor.client.plugins.websocket.WebSockets$Plugin$install$1.invokeSuspend(WebSockets.kt:162)
at io.ktor.client.plugins.websocket.WebSockets$Plugin$install$1.invoke(WebSockets.kt)
at io.ktor.client.plugins.websocket.WebSockets$Plugin$install$1.invoke(WebSockets.kt)
at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:120)
at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:78)
at io.ktor.util.pipeline.SuspendFunctionGun.proceedWith(SuspendFunctionGun.kt:88)
at io.ktor.client.plugins.HttpCallValidator$Companion$install$1.invokeSuspend(HttpCallValidator.kt:126)
at io.ktor.client.plugins.HttpCallValidator$Companion$install$1.invoke(HttpCallValidator.kt)
at io.ktor.client.plugins.HttpCallValidator$Companion$install$1.invoke(HttpCallValidator.kt)
at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:120)
at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:78)
at io.ktor.client.plugins.HttpRequestLifecycle$Plugin$install$1.invokeSuspend(HttpRequestLifecycle.kt:35)
at io.ktor.client.plugins.HttpRequestLifecycle$Plugin$install$1.invoke(HttpRequestLifecycle.kt)
at io.ktor.client.plugins.HttpRequestLifecycle$Plugin$install$1.invoke(HttpRequestLifecycle.kt)
at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:120)
at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:78)
at io.ktor.util.pipeline.SuspendFunctionGun.execute$ktor_utils(SuspendFunctionGun.kt:98)
at io.ktor.util.pipeline.Pipeline.execute(Pipeline.kt:77)
at io.ktor.client.HttpClient.execute$ktor_client_core(HttpClient.kt:191)
at io.ktor.client.statement.HttpStatement.executeUnsafe(HttpStatement.kt:108)
at io.ktor.client.plugins.websocket.BuildersKt.webSocket(builders.kt:243)
at io.ktor.client.plugins.websocket.BuildersKt.webSocket(builders.kt:119)
at io.ktor.client.plugins.websocket.BuildersKt.webSocket(builders.kt:137)
at io.ktor.client.plugins.websocket.BuildersKt.webSocket$default(builders.kt:132)
at ir.amirab.debugboard.ideaplugin.Backend$initiateWebsocket$1.invokeSuspend(Backend.kt:70)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:570)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:677)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:664)
java.lang.NoClassDefFoundError: Could not initialize class io.ktor.client.plugins.websocket.WebSocketsKt
at io.ktor.client.plugins.websocket.WebSockets$Plugin$install$1.invokeSuspend(WebSockets.kt:162)
at io.ktor.client.plugins.websocket.WebSockets$Plugin$install$1.invoke(WebSockets.kt)
at io.ktor.client.plugins.websocket.WebSockets$Plugin$install$1.invoke(WebSockets.kt)
at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:120)
at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:78)
at io.ktor.util.pipeline.SuspendFunctionGun.proceedWith(SuspendFunctionGun.kt:88)
at io.ktor.client.plugins.HttpCallValidator$Companion$install$1.invokeSuspend(HttpCallValidator.kt:126)
at io.ktor.client.plugins.HttpCallValidator$Companion$install$1.invoke(HttpCallValidator.kt)
at io.ktor.client.plugins.HttpCallValidator$Companion$install$1.invoke(HttpCallValidator.kt)
at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:120)
at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:78)
at io.ktor.client.plugins.HttpRequestLifecycle$Plugin$install$1.invokeSuspend(HttpRequestLifecycle.kt:35)
at io.ktor.client.plugins.HttpRequestLifecycle$Plugin$install$1.invoke(HttpRequestLifecycle.kt)
at io.ktor.client.plugins.HttpRequestLifecycle$Plugin$install$1.invoke(HttpRequestLifecycle.kt)
at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:120)
at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:78)
at io.ktor.util.pipeline.SuspendFunctionGun.execute$ktor_utils(SuspendFunctionGun.kt:98)
at io.ktor.util.pipeline.Pipeline.execute(Pipeline.kt:77)
at io.ktor.client.HttpClient.execute$ktor_client_core(HttpClient.kt:191)
at io.ktor.client.statement.HttpStatement.executeUnsafe(HttpStatement.kt:108)
at io.ktor.client.plugins.websocket.BuildersKt.webSocket(builders.kt:243)
at io.ktor.client.plugins.websocket.BuildersKt.webSocket(builders.kt:119)
at io.ktor.client.plugins.websocket.BuildersKt.webSocket(builders.kt:137)
at io.ktor.client.plugins.websocket.BuildersKt.webSocket$default(builders.kt:132)
at ir.amirab.debugboard.ideaplugin.Backend$initiateWebsocket$1.invokeSuspend(Backend.kt:70)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:570)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:677)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:664)
我还测试了 ktor 服务器。它也给我同样的例外! 我的问题是
ktor
是否有效?我用过这些版本
kotlinVersion = "1.8.0"
ideaPluginVersion = "1.13.1"
ktorVersion = "2.2.2"
这是我完整的 build.gradle.kts
plugins {
id("java")
id("org.jetbrains.kotlin.jvm") version "1.8.0"
id("org.jetbrains.intellij") version "1.13.1"
}
group = "com.example"
version = "1.0-SNAPSHOT"
repositories {
mavenCentral()
}
// Configure Gradle IntelliJ Plugin
// Read more: https://plugins.jetbrains.com/docs/intellij/tools-gradle-intellij-plugin.html
intellij {
version.set("2022.1.4")
type.set("IC") // Target IDE Platform
plugins.set(listOf(/* Plugin Dependencies */))
}
dependencies {
val ktorVersion = "2.2.2"
implementation("io.ktor:ktor-client-core:$ktorVersion")
implementation("io.ktor:ktor-client-cio:$ktorVersion")
implementation("io.ktor:ktor-client-websockets:$ktorVersion")
}
tasks {
// Set the JVM compatibility versions
withType<JavaCompile> {
sourceCompatibility = "11"
targetCompatibility = "11"
}
withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
kotlinOptions.jvmTarget = "11"
}
patchPluginXml {
sinceBuild.set("221")
untilBuild.set("231.*")
}
signPlugin {
certificateChain.set(System.getenv("CERTIFICATE_CHAIN"))
privateKey.set(System.getenv("PRIVATE_KEY"))
password.set(System.getenv("PRIVATE_KEY_PASSWORD"))
}
publishPlugin {
token.set(System.getenv("PUBLISH_TOKEN"))
}
}
似乎当我添加 ktor 依赖时
org.slf4j.LoggerFactory.getILoggerFactory()
即使我根本不使用 ktor,这段代码也会抛出异常!
我临时加上这个
configurations.all {
exclude("org.slf4j", "slf4j-api")
}
build.gradle.kts 并解决了我的问题,但我不知道它是否实用但至少有效!
我认为可以在idea插件中使用ktor客户端。
我能够在插件内运行 ktor 客户端 websocket 没有任何问题,它读取并记录传入的消息这是我的代码:
val ktorClient = HttpClient(CIO) {
install(WebSockets)
}
class PluginAction : DumbAwareAction() {
override fun actionPerformed(event: AnActionEvent) {
CoroutineScope(SupervisorJob() + Dispatchers.IO).launch {
ktorClient.webSocket(
method = HttpMethod.Get,
host = "localhost",
path = "/path",
) {
while (true) {
val incoming = (incoming.receive() as Frame.Text).readText()
thisLogger().info("incoming: $incoming")
}
}
}
ktorClient.close()
}
}
build.gradle.kts:
val ktorVersion = "2.2.2"
dependencies {
implementation("io.ktor:ktor-client-core:$ktorVersion")
implementation("io.ktor:ktor-client-cio:$ktorVersion")
implementation("io.ktor:ktor-client-websockets:$ktorVersion")
}
根据您的日志
io.ktor.server.engine.ApplicationEngineEnvironmentBuilder
,您尝试使用 ktor 服务器模块
由于缺少设置而崩溃。
根据您的问题,您确实需要客户。
你也错过了引擎,我用的是СIO
val ktorClient = HttpClient(CIO) {...}
另见:
同样的问题,下面的 gradle 配置
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-swing:1.6.4")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.21")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.0")
implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.0")
implementation("io.ktor:ktor-serialization-jvm:2.3.0")
implementation("io.ktor:ktor-client-cio:2.3.0")
implementation("io.ktor:ktor-client-core:2.3.0")
implementation("io.ktor:ktor-client-auth:2.3.0")
implementation("io.ktor:ktor-client-content-negotiation:2.3.0")
}
并由
修复configurations.all {
exclude("org.slf4j", "slf4j-api")
}