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

无法在 clinit 阶段使用依赖 #1985

Closed
LaoLittle opened this issue Apr 22, 2022 · 7 comments · Fixed by #2735
Closed

无法在 clinit 阶段使用依赖 #1985

LaoLittle opened this issue Apr 22, 2022 · 7 comments · Fixed by #2735
Labels
M 优先级: 主要 s:console 子系统: mirai-console t:problem 类型: 不容易归类为特性或 bug 的综合问题
Milestone

Comments

@LaoLittle
Copy link
Contributor

LaoLittle commented Apr 22, 2022

问题描述

2022-04-22 20:16:31 E/main: Failed to init MiraiConsole.
net.mamoe.mirai.console.internal.util.ServiceLoadException: Could not load service org.laolittle.plugin.SimpleTarot.
        at net.mamoe.mirai.console.internal.util.PluginServiceHelper.loadService(PluginServiceHelper.kt:60)
        at net.mamoe.mirai.console.internal.util.PluginServiceHelper.loadAllServices(PluginServiceHelper.kt:42)
        at net.mamoe.mirai.console.internal.plugin.BuiltInJvmPluginLoaderImpl$extractPlugins$findAllInstances$2.invoke(BuiltInJvmPluginLoaderImpl.kt:146)
        at net.mamoe.mirai.console.internal.plugin.BuiltInJvmPluginLoaderImpl$extractPlugins$findAllInstances$2.invoke(BuiltInJvmPluginLoaderImpl.kt:141)
        at kotlin.sequences.TransformingSequence$iterator$1.next(Sequences.kt:210)
        at kotlin.sequences.FlatteningSequence$iterator$1.ensureItemIterator(Sequences.kt:314)
        at kotlin.sequences.FlatteningSequence$iterator$1.hasNext(Sequences.kt:303)
        at kotlin.sequences.TransformingSequence$iterator$1.hasNext(Sequences.kt:214)
        at kotlin.sequences.TransformingSequence$iterator$1.hasNext(Sequences.kt:214)
        at kotlin.sequences.FlatteningSequence$iterator$1.ensureItemIterator(Sequences.kt:307)
        at kotlin.sequences.FlatteningSequence$iterator$1.hasNext(Sequences.kt:303)
        at kotlin.sequences.SequencesKt___SequencesKt.toCollection(_Sequences.kt:786)
        at kotlin.sequences.SequencesKt___SequencesKt.toSet(_Sequences.kt:827)
        at net.mamoe.mirai.console.internal.plugin.BuiltInJvmPluginLoaderImpl.extractPlugins(BuiltInJvmPluginLoaderImpl.kt:167)
        at net.mamoe.mirai.console.plugin.loader.AbstractFilePluginLoader.listPlugins(FilePluginLoader.kt:51)
        at net.mamoe.mirai.console.plugin.jvm.JvmPluginLoader$BuiltIn.listPlugins(JvmPluginLoader.kt)
        at net.mamoe.mirai.console.internal.plugin.PluginManagerImpl.listAndSortAllPlugins(PluginManagerImpl.kt:195)
        at net.mamoe.mirai.console.internal.plugin.PluginManagerImpl.findAndSortAllPluginsUsingBuiltInLoaders(PluginManagerImpl.kt:141)
        at net.mamoe.mirai.console.internal.plugin.PluginManagerImpl.loadAllPluginsUsingBuiltInLoaders$mirai_console(PluginManagerImpl.kt:151)
        at net.mamoe.mirai.console.internal.MiraiConsoleImplementationBridge.doStart$mirai_console(MiraiConsoleImplementationBridge.kt:175)
        at net.mamoe.mirai.console.MiraiConsoleImplementation$Companion.start(MiraiConsoleImplementation.kt:444)
        at net.mamoe.mirai.console.terminal.MiraiConsoleTerminalLoader.startAsDaemon(MiraiConsoleTerminalLoader.kt:159)
        at net.mamoe.mirai.console.terminal.MiraiConsoleTerminalLoader.startAsDaemon$default(MiraiConsoleTerminalLoader.kt:158)
        at net.mamoe.mirai.console.terminal.MiraiConsoleTerminalLoader.main(MiraiConsoleTerminalLoader.kt:46)
        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:188)
        at org.itxtech.mcl.Loader.tryCatching(Loader.java:146)
        at org.itxtech.mcl.Loader.start(Loader.java:188)
        at org.itxtech.mcl.Loader.main(Loader.java:79)
Caused by: java.lang.NoClassDefFoundError: com/alibaba/druid/pool/DruidDataSource
        at SimpleTarot-1.0.4.mirai.jar//org.laolittle.plugin.SimpleTarot.<clinit>(SimpleTarot.kt:32)
        at java.base/java.lang.Class.forName0(Native Method)
        at java.base/java.lang.Class.forName(Class.java:467)
        at net.mamoe.mirai.console.internal.util.PluginServiceHelper.loadService(PluginServiceHelper.kt:51)
        ... 36 more
Caused by: java.lang.ClassNotFoundException: com.alibaba.druid.pool.DruidDataSource
        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:283)
        ... 40 more

复现

image

使用新版的buildPlugin

plugin-libraries下找到了对应库
image

mirai-core 版本

2.11.0-M2.2

bot-protocol

IPAD

@LaoLittle
Copy link
Contributor Author

LaoLittle commented Apr 22, 2022

已知有多个插件依赖此库

且其他插件是老版本console的插件

@LaoLittle LaoLittle changed the title 无法加载依赖 特定情况下无法加载新版依赖 Apr 22, 2022
@Karlatemp
Copy link
Member

编辑 config/console/logger.yml 开启完全日志(all)并提供完整日志

@Karlatemp Karlatemp added the s:console 子系统: mirai-console label Apr 22, 2022
@LaoLittle
Copy link
Contributor Author

2022-04-22 21:18:38 I/main: Starting mirai-console...
2022-04-22 21:18:38 I/main: Backend: version 2.11.0-M2.2, built on 2022-04-02 19:33:49.
2022-04-22 21:18:38 I/main: Frontend Terminal: version 2.11.0-M2.2, provided by Mamoe Technologies
2022-04-22 21:18:38 I/main: Welcome to visit https://mirai.mamoe.net/
2022-04-22 21:18:38 V/main: Loading JVM plugins...
2022-04-22 21:18:38 W/stderr: SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
2022-04-22 21:18:38 W/stderr: SLF4J: Defaulting to no-operation (NOP) logger implementation
2022-04-22 21:18:38 W/stderr: SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
2022-04-22 21:18:39 D/JvmPluginLoader: Maven        local:  ~/.m2/repository
2022-04-22 21:18:39 D/JvmPluginLoader: Gradle cache local: ~/.gradle/caches/modules-2/files-2.1
2022-04-22 21:18:39 D/JvmPluginLoader: Remote server: [https://maven.aliyun.com/repository/public]
2022-04-22 21:18:39 V/JvmPluginLoader: Plugin shared libraries:  ~/mirai/plugin-shared-libraries
2022-04-22 21:18:39 D/JvmPluginLoader: Peek ~/mirai/plugin-shared-libraries/libraries.txt in shared libraries
2022-04-22 21:18:39 D/JvmPluginLoader: Skipped  ~/mirai/plugin-shared-libraries/libraries.txt because extension <txt> != jar
2022-04-22 21:18:39 V/JvmPluginLoader: Linking static shared libraries....
2022-04-22 21:18:40 D/mirai-slf4j-bridge: SLF4J LOGGER FACTORY = net.mamoe.mirai.logger.bridge.slf4j.MiraiLoggerSlf4jFactoryNOP@18da4dd
2022-04-22 21:18:40 E/main: Failed to init MiraiConsole.
net.mamoe.mirai.console.internal.util.ServiceLoadException: Could not load service org.laolittle.plugin.SimpleTarot.
        at net.mamoe.mirai.console.internal.util.PluginServiceHelper.loadService(PluginServiceHelper.kt:60)
        at net.mamoe.mirai.console.internal.util.PluginServiceHelper.loadAllServices(PluginServiceHelper.kt:42)
        at net.mamoe.mirai.console.internal.plugin.BuiltInJvmPluginLoaderImpl$extractPlugins$findAllInstances$2.invoke(BuiltInJvmPluginLoaderImpl.kt:146)
        at net.mamoe.mirai.console.internal.plugin.BuiltInJvmPluginLoaderImpl$extractPlugins$findAllInstances$2.invoke(BuiltInJvmPluginLoaderImpl.kt:141)
        at kotlin.sequences.TransformingSequence$iterator$1.next(Sequences.kt:210)
        at kotlin.sequences.FlatteningSequence$iterator$1.ensureItemIterator(Sequences.kt:314)
        at kotlin.sequences.FlatteningSequence$iterator$1.hasNext(Sequences.kt:303)
        at kotlin.sequences.TransformingSequence$iterator$1.hasNext(Sequences.kt:214)
        at kotlin.sequences.TransformingSequence$iterator$1.hasNext(Sequences.kt:214)
        at kotlin.sequences.FlatteningSequence$iterator$1.ensureItemIterator(Sequences.kt:307)
        at kotlin.sequences.FlatteningSequence$iterator$1.hasNext(Sequences.kt:303)
        at kotlin.sequences.SequencesKt___SequencesKt.toCollection(_Sequences.kt:786)
        at kotlin.sequences.SequencesKt___SequencesKt.toSet(_Sequences.kt:827)
        at net.mamoe.mirai.console.internal.plugin.BuiltInJvmPluginLoaderImpl.extractPlugins(BuiltInJvmPluginLoaderImpl.kt:167)
        at net.mamoe.mirai.console.plugin.loader.AbstractFilePluginLoader.listPlugins(FilePluginLoader.kt:51)
        at net.mamoe.mirai.console.plugin.jvm.JvmPluginLoader$BuiltIn.listPlugins(JvmPluginLoader.kt)
        at net.mamoe.mirai.console.internal.plugin.PluginManagerImpl.listAndSortAllPlugins(PluginManagerImpl.kt:195)
        at net.mamoe.mirai.console.internal.plugin.PluginManagerImpl.findAndSortAllPluginsUsingBuiltInLoaders(PluginManagerImpl.kt:141)
        at net.mamoe.mirai.console.internal.plugin.PluginManagerImpl.loadAllPluginsUsingBuiltInLoaders$mirai_console(PluginManagerImpl.kt:151)
        at net.mamoe.mirai.console.internal.MiraiConsoleImplementationBridge.doStart$mirai_console(MiraiConsoleImplementationBridge.kt:175)
        at net.mamoe.mirai.console.MiraiConsoleImplementation$Companion.start(MiraiConsoleImplementation.kt:444)
        at net.mamoe.mirai.console.terminal.MiraiConsoleTerminalLoader.startAsDaemon(MiraiConsoleTerminalLoader.kt:159)
        at net.mamoe.mirai.console.terminal.MiraiConsoleTerminalLoader.startAsDaemon$default(MiraiConsoleTerminalLoader.kt:158)
        at net.mamoe.mirai.console.terminal.MiraiConsoleTerminalLoader.main(MiraiConsoleTerminalLoader.kt:46)
        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:188)
        at org.itxtech.mcl.Loader.tryCatching(Loader.java:146)
        at org.itxtech.mcl.Loader.start(Loader.java:188)
        at org.itxtech.mcl.Loader.main(Loader.java:79)
Caused by: java.lang.NoClassDefFoundError: org/jetbrains/exposed/sql/Table
        at java.base/java.lang.ClassLoader.defineClass1(Native Method)
        at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1012)
        at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
        at java.base/java.net.URLClassLoader.defineClass(URLClassLoader.java:524)
        at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:427)
        at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:421)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:712)
        at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:420)
        at net.mamoe.mirai.console.internal.plugin.JvmPluginClassLoaderN.loadClass(JvmPluginClassLoader.kt:268)
        at SimpleTarot-1.0.4.mirai.jar//org.laolittle.plugin.SimpleTarot.<clinit>(SimpleTarot.kt:30)
        at java.base/java.lang.Class.forName0(Native Method)
        at java.base/java.lang.Class.forName(Class.java:467)
        at net.mamoe.mirai.console.internal.util.PluginServiceHelper.loadService(PluginServiceHelper.kt:51)
        ... 36 more
Caused by: java.lang.ClassNotFoundException: org.jetbrains.exposed.sql.Table
        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:283)
        ... 49 more

@LaoLittle
Copy link
Contributor Author

image

@Him188 Him188 added this to the 2.11.0-RC milestone Apr 22, 2022
@LaoLittle
Copy link
Contributor Author

image

检查包文件META,是有依赖信息的

@Karlatemp
Copy link
Member

        at SimpleTarot-1.0.4.mirai.jar//org.laolittle.plugin.SimpleTarot.<clinit>(SimpleTarot.kt:30)
        at java.base/java.lang.Class.forName0(Native Method)
        at java.base/java.lang.Class.forName(Class.java:467)
        at net.mamoe.mirai.console.internal.util.PluginServiceHelper.loadService(PluginServiceHelper.kt:51)

由于目前的插件系统设计为构造器传递所依赖的插件, 即在 <init> 后我们才能知道插件具体的依赖分析链
而目前设计下, 我们无法推断完整的依赖链, 在 <clinit> 时我们还没有拿到相关的依赖信息所以我们无法挂载依赖等信息

@Karlatemp Karlatemp removed their assignment Apr 22, 2022
@Karlatemp Karlatemp modified the milestones: 2.11.0-RC, Backlog Apr 22, 2022
@Karlatemp Karlatemp added the N 优先级: 一般 label Apr 22, 2022
@Him188 Him188 added M 优先级: 主要 t:problem 类型: 不容易归类为特性或 bug 的综合问题 and removed N 优先级: 一般 labels Apr 22, 2022
@Him188 Him188 changed the title 特定情况下无法加载新版依赖 无法在 clinit 阶段使用依赖 Apr 25, 2022
@Him188
Copy link
Member

Him188 commented Apr 25, 2022

我觉得需要支持两种 desc 加载方式,一种是现在的,一种是通过一个文件,如 plugin.yml(实际上现在也是支持的)

可以为 JvmPlugin 增加一个无参数构造器,表示使用 plugin.yml 等来提供依赖信息。那么 JvmPluginLoader 可以在存在 plugin.yml 的情况下分析并在加载 class 前链接依赖。

旧方案将继续支持,IDE 新生成的模板将会使用这种新方案。

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

Successfully merging a pull request may close this issue.

3 participants