MrXiaoM/Overflow

Overflow 最新快照版,无法向GlobalListenerHost添加内容

Closed this issue · 2 comments

问题描述

报错日志,注意cause部分:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'groupAtListener' defined in URL [jar:nested:/home/kagg886/youmu/youmu-bot-0.0.1-SNAPSHOT.jar/!BOOT-INF/classes/!/top/kagg886/youmu/bot/listener/GroupAtListener.class]: Could not find an implementation for service class net.mamoe.mirai.event.InternalGlobalEventChannelProvider
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:607)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:975)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:971)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:625)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:335)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352)
	at top.kagg886.youmu.CarbonBotApplicationKt.main(CarbonBotApplication.kt:17)
	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:569)
	at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:102)
	at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:64)
	at org.springframework.boot.loader.launch.JarLauncher.main(JarLauncher.java:40)
Caused by: java.util.NoSuchElementException: Could not find an implementation for service class net.mamoe.mirai.event.InternalGlobalEventChannelProvider
	at net.mamoe.mirai.utils.ServicesKt.loadService(Services.kt:58)
	at net.mamoe.mirai.utils.ServicesKt.loadService$default(Services.kt:30)
	at net.mamoe.mirai.event.GlobalEventChannel$instance$2.invoke(GlobalEventChannel.kt:35)
	at net.mamoe.mirai.event.GlobalEventChannel$instance$2.invoke(GlobalEventChannel.kt:34)
	at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
	at net.mamoe.mirai.event.GlobalEventChannel.getInstance(GlobalEventChannel.kt:34)
	at net.mamoe.mirai.event.GlobalEventChannel.createListener(GlobalEventChannel.kt:48)
	at net.mamoe.mirai.event.EventChannel.createListener0$mirai_core_api(EventChannel.kt:738)
	at net.mamoe.mirai.event.EventChannel.subscribeAlways(EventChannel.kt:484)
	at net.mamoe.mirai.internal.event.JvmMethodListenersInternal.registerEventHandler$mirai_core_api(JvmMethodListenersInternal.kt:108)
	at net.mamoe.mirai.event.EventChannel.registerListenerHost(EventChannel.kt:566)
	at net.mamoe.mirai.event.EventChannel.registerListenerHost$default(EventChannel.kt:530)
	at top.kagg886.youmu.bot.EventListenerScanner.postProcessAfterInitialization(EventListenerScanner.kt:14)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:438)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1809)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600)
	... 22 common frames omitted

复现

gradle构建脚本:

// 清除现有的lib目录
tasks.register<Delete>("clearJar") {
    delete(layout.buildDirectory.dir("libs/lib"))
}
// 清除现有的res目录
tasks.register<Delete>("clearRes") {
    delete(layout.buildDirectory.dir("libs/res"))
}

// 将依赖包复制到lib目录
tasks.register<Copy>("copyJar") {
    dependsOn("clearJar")
    from(configurations.runtimeClasspath)
    into(layout.buildDirectory.dir("libs/lib"))
}

// 将资源文件复制到res目录
tasks.register<Copy>("copyRes") {
    dependsOn("clearRes")
    from("src/main/resources")
    into(layout.buildDirectory.dir("libs/res"))
}

tasks.bootJar {
    // 排除所有的jar
    exclude("*.jar")
    exclude("assets/**")
    exclude("static/**")
    exclude("application.properties")

    // lib目录的清除和复制任务
    dependsOn("clearJar", "clearRes")
    dependsOn("copyJar", "copyRes")

    // 指定依赖包的路径
    manifest {
        attributes(
            "Manifest-Version" to "1.0",
            "Class-Path" to configurations.runtimeClasspath.get().files.joinToString(" ") {
                "lib/${it.name}"
            } + " res/"
        )
    }
    finalizedBy("generateLibHash")
}

gradle依赖列表

    //mirai
    compileOnly("net.mamoe:mirai-core-api:2.16.0")
    implementation("top.mrxiaom.mirai:overflow-core-api:0.9.9.513-b165a7a-SNAPSHOT")

该类的源代码

package top.kagg886.youmu.bot.listener

import kotlinx.coroutines.runBlocking
import net.mamoe.mirai.event.EventHandler
import net.mamoe.mirai.event.SimpleListenerHost
import net.mamoe.mirai.event.events.GroupMessageEvent
import net.mamoe.mirai.message.data.At
import net.mamoe.mirai.message.data.findIsInstance
import org.springframework.stereotype.Component

@Component
class GroupAtListener : SimpleListenerHost() {
    @EventHandler
    fun onGroupAt(event: GroupMessageEvent) {
        val ob = event.message.filterIsInstance<At>().find { it.target == event.bot.id } != null
        if (ob) {
            runBlocking {
                event.subject.sendMessage("""
                    不需要at bot,也不需要添加前缀,直接发送对应的指令即可喵!
                    指令列表:https://youmu.kagg886.top/#/command
                """.trimIndent())
            }
        }
    }
}

Overflow 版本

b165a7a

其他组件版本

napcat截止到2024-9-29的最新版

系统日志

因为使用的是overflow-core,故无此日志

网络日志

因为使用的是overflow-core并将日志手动桥接到SpringBoot并修改优先级一律为info,故无此日志

补充信息

No response

补充一下自动注册的代码:

@Component
class EventListenerScanner : BeanPostProcessor {
    override fun postProcessAfterInitialization(bean: Any, beanName: String): Any? {
        if (bean is ListenerHost) {
            GlobalEventChannel.registerListenerHost(bean)
            log.info("注册ListenerHost: $bean")
        }

        return bean
    }
}

你引用的依赖是 overflow-core-api,这个包跟 mirai-core-api 的性质一样,并不包含实现,当然不可能找得到 SPI(