我有两个自己写的插件。 NovEcon2 和 RealBanks2。
NovEcon2 是我的经济插件,它依赖于
Vault
和 RealBanks2
作为软依赖。
RealBanks2 是我的银行插件,它也取决于 Vault
。
源代码可以在这里找到(重要,留在分支
kotlin-rewrite
):
我在 RealBanks2 中实现了一个 api,以访问 NovEcon2 中的一些功能。
可以在 NovEcon2 中启用 api,通过将 configlet-bool 设置为
true
但是,由于这两个插件都依赖于 Vault
,因此在 configlet-bool 设置为 true
时加载它们目前是不可能的。
由于 RealBanks2 需要加载经济插件,而 NovEcon2 需要加载 RealBanks2,因此它们都不会被加载。 最终导致 NovEcon2 无法加载,因为 RealBanks2 未加载,并且 RealBanks2 无法加载,因为没有经济插件连接到金库,例如 NovEcon2。
其他一些人将其称为“依赖循环”。 这是服务器启动时控制台中的样子:
[18:31:35 INFO]: [Vault] Enabling Vault v1.7.3-b131
[18:31:35 INFO]: [Vault] [Permission] SuperPermissions loaded as backup permission system.
[18:31:35 INFO]: [Vault] Enabled Version 1.7.3-b131
[18:31:35 INFO]: [NovEcon2] Enabling NovEcon2 v1.0.0
[18:31:35 ERROR]: [NovEcon2] - Disabled due to no RealBanks dependency found!
[18:31:35 INFO]: [NovEcon2] Disabling NovEcon2 v1.0.0
....
[18:31:36 INFO]: [RealBanks2] Enabling RealBanks2 v2.0.0
[18:31:36 ERROR]: [RealBanks2] - Disabled due to no Vault dependency found!
[18:31:36 INFO]: [RealBanks2] Disabling RealBanks2 v2.0.0
我考虑过一个单独的桥接插件,但是据我所知,它会以同样的问题结束,因为 NovEcon2 需要桥接插件,而桥接插件将依赖于 RealBanks2。
更改
plugin.yml
中依赖的插件的顺序或添加loadbefore
并没有帮助我更接近可行的解决方案。
这没有任何结果,但仍然失败。
经过长时间的搜索,以下过程解决了我的问题:
有一个事件,叫做
ServiceRegisterEvent
。当服务在服务器启动时注册时,它可用于获取服务。
我监听了服务
Economy
,如果发生这种情况,我加载了经济插件。
我还必须编辑银行插件的
plugin.yml
,以便在经济插件之前加载。
服务注册事件:
internal class ServiceRegisterListener(private val realBanks2: RealBanks) : Listener {
@EventHandler
fun onEconomyServiceRegister(e: ServiceRegisterEvent) {
if(e.provider.service.simpleName.equals("Economy")) {
if(!realBanks2.setupEconomy()) {
RealBanks.LOG.severe(String.format("[%s] - Disabled due to no Vault dependency found!", realBanks2.name))
realBanks2.server.pluginManager.disablePlugin(realBanks2)
return
}
}
}
}
插件.yml
name: RealBanks2
version: ${project.version}
main: me.linuxsquare.realbanks2.RealBanks
api-version: "1.19"
depend: [Vault, PlayerUUIDCache]
loadbefore:
- NovEcon2
author: LinuxSquare
website: https://codeberg.org/Noveria/RealBanks2