Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2.12.0-RC 前置插件存在私有依赖时, 插件无法链接相同依赖 #2108

Closed
cssxsh opened this issue Jun 21, 2022 · 4 comments
Closed
Labels
M 优先级: 主要 s:console 子系统: mirai-console t:problem 类型: 不容易归类为特性或 bug 的综合问题
Milestone

Comments

@cssxsh
Copy link
Contributor

cssxsh commented Jun 21, 2022

问题描述

一共有两个问题

  1. 在插件里有使用 mirai-console 内置带有的 ktor 1.0 的插件 (下面日志里的 bilibili-helper),
    添加了 ktor 1.0 的扩展
    然后 bilibili-helper 在 http-client 初始化时报错。(日志 1)

  2. bilibili-helper 进行升级到了 ktor 2.0,初始化时也出现的报错 (日志 2),
    经测试发现是依赖问题,bilibili-helper 有 个前置依赖 mirai-selenium-plugin ,我给这个前置插件 也升级到了 ktor 2.0

复现

问题 1

package org.example.test

import io.ktor.client.*
import io.ktor.client.engine.okhttp.*
import net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription
import net.mamoe.mirai.console.plugin.jvm.KotlinPlugin
import net.mamoe.mirai.utils.info

object Ktor1 : KotlinPlugin(
    JvmPluginDescription(
        id = "org.example.test.ktor1",
        version = "1.0-SNAPSHOT",
    )
) {
    override fun onEnable() {
        val client = HttpClient(OkHttp)
        logger.info { "Plugin loaded" }
    }
}
plugins {
    kotlin("jvm") version "1.6.21"
    kotlin("plugin.serialization") version "1.6.21"

    id("net.mamoe.mirai-console") version "2.12.0-RC"
}

group = "org.example.test"
version = "1.0-SNAPSHOT"

repositories {
    mavenCentral()
}

dependencies {
    // case 1 添加 扩展 ,但是 没有 implementation("io.ktor:ktor-client-okhttp:1.6.7")
    // 报错
    implementation("io.ktor:ktor-client-serialization:1.6.7")
    implementation("io.ktor:ktor-client-encoding:1.6.7")

    // case 2 添加 扩展 ,但是 有 implementation("io.ktor:ktor-client-okhttp:1.6.7")
    // 不报错
    implementation("io.ktor:ktor-client-okhttp:1.6.7")
    implementation("io.ktor:ktor-client-serialization:1.6.7")
    implementation("io.ktor:ktor-client-encoding:1.6.7")

    // case 3 不添加扩展,不报错
}

问题 2

新建两个插件 KtorTest1 KtorTest2,
KtorTest2 依赖 KtorTest1

build.gradle.kts (两者一致)

plugins {
    kotlin("jvm") version "1.6.21"
    kotlin("plugin.serialization") version "1.6.21"

    id("net.mamoe.mirai-console") version "2.12.0-RC"
}

group = "org.example.test"
version = "1.0-SNAPSHOT"

repositories {
    mavenCentral()
}

dependencies {
    implementation("io.ktor:ktor-client-okhttp:2.0.2")
}
package org.example.test1

import net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription
import net.mamoe.mirai.console.plugin.jvm.KotlinPlugin
import net.mamoe.mirai.utils.info

object KtorTest1 : KotlinPlugin(
    JvmPluginDescription(
        id = "org.example.test1.ktor",
        version = "1.0-SNAPSHOT",
    )
) {
    override fun onEnable() {
        logger.info { "Plugin loaded" }
    }
}
package org.example.test2

import io.ktor.client.*
import io.ktor.client.engine.okhttp.*
import io.ktor.client.plugins.*
import io.ktor.client.plugins.cookies.*
import net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription
import net.mamoe.mirai.console.plugin.jvm.KotlinPlugin
import net.mamoe.mirai.utils.info

object KtorTest2 : KotlinPlugin(
    JvmPluginDescription(
        id = "org.example.test2.ktor",
        version = "1.0-SNAPSHOT",
    ) {
        dependsOn("org.example.test1.ktor")
    }
) {
    override fun onEnable() {
        val cookeis = AcceptAllCookiesStorage()
        val client = HttpClient(OkHttp) {
            BrowserUserAgent()
        }
        logger.info { "Plugin loaded" }
    }
}

mirai-core 版本

1.12.0-RC

bot-protocol

ANDROID_PHONE

其他组件版本

api("io.ktor:ktor-client-auth:2.0.2")
api("io.ktor:ktor-client-encoding:2.0.2")
api("io.ktor:ktor-client-okhttp:2.0.2")
api("io.ktor:ktor-client-content-negotiation:2.0.2")
api("io.ktor:ktor-serialization-kotlinx-json:2.0.2")

系统日志

日志 1

2022-06-21 18:07:54 E/bilibili-helper: java.lang.ClassCastException: class io.ktor.client.engine.okhttp.OkHttp cannot be cast to class io.ktor.client.engine.HttpClientEngineFactory (io.ktor.client.engine.okhttp.OkHttp is in unnamed module of loader 'app'; io.ktor.client.engine.HttpClientEngineFactory is in unnamed module of loader 'bilibili-helper-1.6.0.mirai2.jar[private]' @6e43ddd6)
java.lang.ClassCastException: class io.ktor.client.engine.okhttp.OkHttp cannot be cast to class io.ktor.client.engine.HttpClientEngineFactory (io.ktor.client.engine.okhttp.OkHttp is in unnamed module of loader 'app'; io.ktor.client.engine.HttpClientEngineFactory is in unnamed module of loader 'bilibili-helper-1.6.0.mirai2.jar[private]' @6e43ddd6)
	at bilibili-helper-1.6.0.mirai2.jar//xyz.cssxsh.bilibili.BiliClient.client(BiliClient.kt:39)
	at bilibili-helper-1.6.0.mirai2.jar//xyz.cssxsh.bilibili.BiliClient.<init>(BiliClient.kt:67)
	at bilibili-helper-1.6.0.mirai2.jar//xyz.cssxsh.bilibili.BiliClient.<init>(BiliClient.kt:19)
	at bilibili-helper-1.6.0.mirai2.jar//xyz.cssxsh.mirai.bilibili.BiliUtilsKt$client$2$1.<init>(BiliUtils.kt:65)
	at bilibili-helper-1.6.0.mirai2.jar//xyz.cssxsh.mirai.bilibili.BiliUtilsKt$client$2.invoke(BiliUtils.kt:65)
	at bilibili-helper-1.6.0.mirai2.jar//xyz.cssxsh.mirai.bilibili.BiliUtilsKt$client$2.invoke(BiliUtils.kt:64)
	at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
	at bilibili-helper-1.6.0.mirai2.jar//xyz.cssxsh.mirai.bilibili.BiliUtilsKt.getClient(BiliUtils.kt:64)
	at bilibili-helper-1.6.0.mirai2.jar//xyz.cssxsh.mirai.bilibili.BiliHelperPlugin.onEnable(BiliHelperPlugin.kt:49)
	at net.mamoe.mirai.console.internal.plugin.JvmPluginInternal.internalOnEnable$mirai_console(JvmPluginInternal.kt:131)
	at net.mamoe.mirai.console.internal.plugin.BuiltInJvmPluginLoaderImpl.enable(BuiltInJvmPluginLoaderImpl.kt:278)
	at net.mamoe.mirai.console.internal.plugin.BuiltInJvmPluginLoaderImpl.enable(BuiltInJvmPluginLoaderImpl.kt:35)
	at net.mamoe.mirai.console.plugin.jvm.JvmPluginLoader$BuiltIn.enable(JvmPluginLoader.kt)
	at net.mamoe.mirai.console.plugin.jvm.JvmPluginLoader$BuiltIn.enable(JvmPluginLoader.kt:50)
	at net.mamoe.mirai.console.plugin.PluginManager.enablePlugin(PluginManager.kt:173)
	at net.mamoe.mirai.console.internal.plugin.PluginManagerImpl.enableAllLoadedPlugins$mirai_console(PluginManagerImpl.kt:178)
	at net.mamoe.mirai.console.internal.MiraiConsoleImplementationBridge.doStart$mirai_console(MiraiConsoleImplementationBridge.kt:235)
	at net.mamoe.mirai.console.MiraiConsoleImplementation$Companion.start(MiraiConsoleImplementation.kt:464)
	at net.mamoe.mirai.console.terminal.MiraiConsoleTerminalLoader.startAsDaemon(MiraiConsoleTerminalLoader.kt:168)
	at net.mamoe.mirai.console.terminal.MiraiConsoleTerminalLoader.startAsDaemon$default(MiraiConsoleTerminalLoader.kt:167)
	at net.mamoe.mirai.console.terminal.MiraiConsoleTerminalLoader.main(MiraiConsoleTerminalLoader.kt:52)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.itxtech.mcl.Utility.bootJars(Utility.java:89)
	at org.itxtech.mcl.Utility.bootJars(Utility.java:79)
	at org.itxtech.mcl.Utility.bootMirai(Utility.java:101)
	at org.itxtech.mcl.module.builtin.Boot.boot(Boot.java:109)
	at org.itxtech.mcl.module.ModuleManager.phaseBoot(ModuleManager.java:148)
	at org.itxtech.mcl.Loader.lambda$start$4(Loader.java:189)
	at org.itxtech.mcl.Loader.tryCatching(Loader.java:146)
	at org.itxtech.mcl.Loader.start(Loader.java:189)
	at org.itxtech.mcl.Loader.main(Loader.java:79)

2022-06-21 18:07:54 V/JvmPluginLoader: Enabled  plugin bilibili-helper v1.6.0

日志 2

2022-06-21 20:44:47 V/JvmPluginLoader: Enabling plugin bilibili-helper v1.7.0
2022-06-21 20:44:47 E/bilibili-helper: java.lang.NoClassDefFoundError: io/ktor/client/plugins/cookies/AcceptAllCookiesStorage
java.lang.NoClassDefFoundError: io/ktor/client/plugins/cookies/AcceptAllCookiesStorage
	at bilibili-helper-1.7.0.mirai2.jar//xyz.cssxsh.bilibili.BiliClient.<init>(BiliClient.kt:35)
	at bilibili-helper-1.7.0.mirai2.jar//xyz.cssxsh.bilibili.BiliClient.<init>(BiliClient.kt:19)
	at bilibili-helper-1.7.0.mirai2.jar//xyz.cssxsh.mirai.bilibili.BiliUtilsKt$client$2$1.<init>(BiliUtils.kt:66)
	at bilibili-helper-1.7.0.mirai2.jar//xyz.cssxsh.mirai.bilibili.BiliUtilsKt$client$2.invoke(BiliUtils.kt:66)
	at bilibili-helper-1.7.0.mirai2.jar//xyz.cssxsh.mirai.bilibili.BiliUtilsKt$client$2.invoke(BiliUtils.kt:65)
	at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
	at bilibili-helper-1.7.0.mirai2.jar//xyz.cssxsh.mirai.bilibili.BiliUtilsKt.getClient(BiliUtils.kt:65)
	at bilibili-helper-1.7.0.mirai2.jar//xyz.cssxsh.mirai.bilibili.BiliHelperPlugin.onEnable(BiliHelperPlugin.kt:49)
	at net.mamoe.mirai.console.internal.plugin.JvmPluginInternal.internalOnEnable$mirai_console(JvmPluginInternal.kt:131)
	at net.mamoe.mirai.console.internal.plugin.BuiltInJvmPluginLoaderImpl.enable(BuiltInJvmPluginLoaderImpl.kt:278)
	at net.mamoe.mirai.console.internal.plugin.BuiltInJvmPluginLoaderImpl.enable(BuiltInJvmPluginLoaderImpl.kt:35)
	at net.mamoe.mirai.console.plugin.jvm.JvmPluginLoader$BuiltIn.enable(JvmPluginLoader.kt)
	at net.mamoe.mirai.console.plugin.jvm.JvmPluginLoader$BuiltIn.enable(JvmPluginLoader.kt:50)
	at net.mamoe.mirai.console.plugin.PluginManager.enablePlugin(PluginManager.kt:173)
	at net.mamoe.mirai.console.internal.plugin.PluginManagerImpl.enableAllLoadedPlugins$mirai_console(PluginManagerImpl.kt:178)
	at net.mamoe.mirai.console.internal.MiraiConsoleImplementationBridge.doStart$mirai_console(MiraiConsoleImplementationBridge.kt:235)
	at net.mamoe.mirai.console.MiraiConsoleImplementation$Companion.start(MiraiConsoleImplementation.kt:464)
	at net.mamoe.mirai.console.terminal.MiraiConsoleTerminalLoader.startAsDaemon(MiraiConsoleTerminalLoader.kt:168)
	at net.mamoe.mirai.console.terminal.MiraiConsoleTerminalLoader.startAsDaemon$default(MiraiConsoleTerminalLoader.kt:167)
	at net.mamoe.mirai.console.terminal.MiraiConsoleTerminalLoader.main(MiraiConsoleTerminalLoader.kt:52)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.itxtech.mcl.Utility.bootJars(Utility.java:89)
	at org.itxtech.mcl.Utility.bootJars(Utility.java:79)
	at org.itxtech.mcl.Utility.bootMirai(Utility.java:101)
	at org.itxtech.mcl.module.builtin.Boot.boot(Boot.java:109)
	at org.itxtech.mcl.module.ModuleManager.phaseBoot(ModuleManager.java:148)
	at org.itxtech.mcl.Loader.lambda$start$4(Loader.java:189)
	at org.itxtech.mcl.Loader.tryCatching(Loader.java:146)
	at org.itxtech.mcl.Loader.start(Loader.java:189)
	at org.itxtech.mcl.Loader.main(Loader.java:79)
Caused by: java.lang.ClassNotFoundException: io.ktor.client.plugins.cookies.AcceptAllCookiesStorage
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
	at net.mamoe.mirai.console.internal.plugin.JvmPluginClassLoaderN.loadClass(JvmPluginClassLoader.kt:383)
	... 33 more

2022-06-21 20:44:48 V/JvmPluginLoader: Enabled  plugin bilibili-helper v1.7.0


### 网络日志

_No response_

### 补充信息

_No response_
@Karlatemp
Copy link
Member

请详细的清晰的描述,我无法从你的issue中梳理出有效信息

  • 谁做了什么
  • 详细的依赖关系
  • 为什么会存在 1.x 2.x混用

@Karlatemp Karlatemp added the z:wait-for-reply 状态: 等待回复 label Jun 21, 2022
@cssxsh cssxsh changed the title 2.12.0-RC 仍不能在 mirai-console-plugin 中使用 ktor 2.0 2.12.0-RC mirai-console-plugin 中使用 ktor 1.0 / 2.0 报错 Jun 21, 2022
@cssxsh
Copy link
Contributor Author

cssxsh commented Jun 22, 2022

@Karlatemp 测试发现 不只是 ktor 2.0 ,其他 maven 库 例如 "org.jsoup:jsoup:1.14.3",
如果前置插件 和当前插件 都引用了,当前插件会找不到类 org.jsoup.Jsoup

@Karlatemp
Copy link
Member

1是符合期望的,你直接引用了ktor1, 但是你并没有直接引用okhttp, 那么依赖列表里也不会存在 okhttp
此时ktor已经加载进 plugin[private] 了,但是okhttp并没有被引用,那么从fallback策略拿到的位于 appclassloader 的类是无法转换成位于 plugin[private] 的类的

@Karlatemp Karlatemp added M 优先级: 主要 s:console 子系统: mirai-console t:problem 类型: 不容易归类为特性或 bug 的综合问题 and removed z:wait-for-reply 状态: 等待回复 labels Jun 22, 2022
@cssxsh
Copy link
Contributor Author

cssxsh commented Jun 22, 2022

新建两个插件 KtorTest1 KtorTest2,
KtorTest2 依赖 KtorTest1

build.gradle.kts (两者一致), 都有 implementation("org.jsoup:jsoup:1.14.3")

plugins {
    kotlin("jvm") version "1.6.21"
    kotlin("plugin.serialization") version "1.6.21"

    id("net.mamoe.mirai-console") version "2.12.0-RC"
}

group = "org.example.test"
version = "1.0-SNAPSHOT"

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.jsoup:jsoup:1.14.3")
}

KtorTest1

package org.example.test1

import net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription
import net.mamoe.mirai.console.plugin.jvm.KotlinPlugin
import net.mamoe.mirai.utils.info

object Ktor1 : KotlinPlugin(
    JvmPluginDescription(
        id = "org.example.test1.ktor",
        version = "1.0-SNAPSHOT",
    )
) {
    override fun onEnable() {
        logger.info(org.jsoup.Jsoup.parse("<body></body>").toString())
        logger.info { "Plugin loaded" }
    }
}

KtorTest2, 引用 KtorTest1

package org.example.test2

import net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription
import net.mamoe.mirai.console.plugin.jvm.KotlinPlugin
import net.mamoe.mirai.utils.info

object Ktor : KotlinPlugin(
    JvmPluginDescription(
        id = "org.example.test2.ktor",
        version = "1.0-SNAPSHOT",
    ) {
        dependsOn("org.example.test1.ktor")
    }
) {
    override fun onEnable() {
        logger.info(org.jsoup.Jsoup.parse("<body></body>").toString())
        logger.info { "Plugin loaded" }
    }
}

KtorTest2 报错

2022-06-22 16:31:10 I/plugin: Successfully loaded plugin org.example.test1.ktor v1.0-SNAPSHOT
2022-06-22 16:31:10 I/plugin: Successfully loaded plugin org.example.test2.ktor v1.0-SNAPSHOT
2022-06-22 16:31:10 I/main: Prepared built-in commands: autoLogin, help, login, logout, permission, status, stop
2022-06-22 16:31:10 I/org.example.test1.ktor: <html>
 <head></head>
 <body></body>
</html>
2022-06-22 16:31:10 I/org.example.test1.ktor: Plugin loaded
2022-06-22 16:31:10 E/org.example.test2.ktor: java.lang.NoClassDefFoundError: org/jsoup/Jsoup
java.lang.NoClassDefFoundError: org/jsoup/Jsoup
	at ktor2-dev.mirai2.jar//org.example.test2.Ktor.onEnable(Ktor2.kt:16)
	at net.mamoe.mirai.console.internal.plugin.JvmPluginInternal.internalOnEnable$mirai_console(JvmPluginInternal.kt:131)
	at net.mamoe.mirai.console.internal.plugin.BuiltInJvmPluginLoaderImpl.enable(BuiltInJvmPluginLoaderImpl.kt:278)
	at net.mamoe.mirai.console.internal.plugin.BuiltInJvmPluginLoaderImpl.enable(BuiltInJvmPluginLoaderImpl.kt:35)
	at net.mamoe.mirai.console.plugin.jvm.JvmPluginLoader$BuiltIn.enable(JvmPluginLoader.kt)
	at net.mamoe.mirai.console.plugin.jvm.JvmPluginLoader$BuiltIn.enable(JvmPluginLoader.kt:50)
	at net.mamoe.mirai.console.plugin.PluginManager.enablePlugin(PluginManager.kt:173)
	at net.mamoe.mirai.console.internal.plugin.PluginManagerImpl.enableAllLoadedPlugins$mirai_console(PluginManagerImpl.kt:178)
	at net.mamoe.mirai.console.internal.MiraiConsoleImplementationBridge.doStart$mirai_console(MiraiConsoleImplementationBridge.kt:235)
	at net.mamoe.mirai.console.MiraiConsoleImplementation$Companion.start(MiraiConsoleImplementation.kt:464)
	at net.mamoe.mirai.console.terminal.MiraiConsoleTerminalLoader.startAsDaemon(MiraiConsoleTerminalLoader.kt:168)
	at net.mamoe.mirai.console.terminal.MiraiConsoleTerminalLoader.startAsDaemon$default(MiraiConsoleTerminalLoader.kt:167)
	at net.mamoe.mirai.console.terminal.MiraiConsoleTerminalLoader.main(MiraiConsoleTerminalLoader.kt:52)
Caused by: java.lang.ClassNotFoundException: org.jsoup.Jsoup
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
Caused by: java.lang.ClassNotFoundException: org.jsoup.Jsoup

	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
	at net.mamoe.mirai.console.internal.plugin.JvmPluginClassLoaderN.loadClass(JvmPluginClassLoader.kt:383)
	... 13 more

2022-06-22 16:31:10 I/main: 1 plugin(s) enabled.

@Karlatemp Karlatemp changed the title 2.12.0-RC mirai-console-plugin 中使用 ktor 1.0 / 2.0 报错 2.12.0-RC 前置插件存在私有依赖时, 插件无法链接相同依赖 Jun 22, 2022
@Karlatemp Karlatemp added this to the 2.12.0 milestone Jun 22, 2022
Him188 pushed a commit that referenced this issue Jul 2, 2022
cssxsh pushed a commit to SkyNet1748/mirai that referenced this issue Jul 20, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
M 优先级: 主要 s:console 子系统: mirai-console t:problem 类型: 不容易归类为特性或 bug 的综合问题
Projects
None yet
Development

No branches or pull requests

2 participants