Overflow 最新快照版,无法向GlobalListenerHost添加内容
Closed this issue · 2 comments
kagg886 commented
问题描述
报错日志,注意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 版本
其他组件版本
napcat截止到2024-9-29的最新版
系统日志
因为使用的是overflow-core,故无此日志
网络日志
因为使用的是overflow-core并将日志手动桥接到SpringBoot并修改优先级一律为info,故无此日志
补充信息
No response
kagg886 commented
补充一下自动注册的代码:
@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
}
}
MrXiaoM commented
你引用的依赖是 overflow-core-api
,这个包跟 mirai-core-api
的性质一样,并不包含实现,当然不可能找得到 SPI(