Bukkit API 软依赖导入
Bukkit API Soft Depend Importing
我的 plugin.yml 有软依赖:
softdepend: [Plugin]
我使用这个检查插件是否不在服务器中:
if(getServer().getPluginManager().getPlugin("Plugin") != null) {
// do stuff
}
即使我在 运行 安装我的代码之前检查插件文件夹中是否存在插件,我仍然从这个插件导入,当插件不在服务器上时会抛出错误。由于我从 softdepended 插件中导入,我得到了 InvalidPluginException
。如果插件文件夹中的插件可用,我需要将这些导入 运行 我使用的代码。注意:如果找不到 softdepend 插件,我不想禁用该插件。
如何保持从 softdepended 插件导入而不引发此错误。
我试过在 Bukkit 论坛和 Stack Overflow 上寻找类似的问题,但我没有运气。
错误如下所示:
org.bukkit.plugin.InvalidPluginException: java.lang.NoClassDefFoundError: be/maximvdw/featherboard/api/PlaceholderAPI$PlaceholderRequestEventHandler
在 org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:135) ~[craftbukkit.jar:git-Spigot-26dfd01-5cb9b70]
在 org.bukkit.plugin.SimplePluginManager.loadPlugin(SimplePluginManager.java:329) ~[craftbukkit.jar:git-Spigot-26dfd01-5cb9b70]
在 org.bukkit.plugin.SimplePluginManager.loadPlugins(SimplePluginManager.java:251) [craftbukkit.jar:git-Spigot-26dfd01-5cb9b70]
在 org.bukkit.craftbukkit.v1_8_R2.CraftServer.loadPlugins(CraftServer.java:291) [craftbukkit.jar:git-Spigot-26dfd01-5cb9b70]
在 net.minecraft.server.v1_8_R2.DedicatedServer.init(DedicatedServer.java:199) [craftbukkit.jar:git-Spigot-26dfd01-5cb9b70]
在 net.minecraft.server.v1_8_R2.MinecraftServer.run(MinecraftServer.java:522) [craftbukkit.jar:git-Spigot-26dfd01-5cb9b70]
在 java.lang.Thread.run(未知来源)[?:1.8.0_25]
由以下原因引起:java.lang.NoClassDefFoundError:be/maximvdw/featherboard/api/PlaceholderAPI$PlaceholderRequestEventHandler
在 (java:21) ~[?:?]
在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)~[?:1.8.0_25]
在 sun.reflect.NativeConstructorAccessorImpl.newInstance(未知来源)~[?:1.8.0_25]
在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(未知来源)~[?:1.8.0_25]
在 java.lang.reflect.Constructor.newInstance(未知来源)~[?:1.8.0_25]
在 java.lang.Class.newInstance(未知来源)~[?:1.8.0_25]
在 org.bukkit.plugin.java.PluginClassLoader.(PluginClassLoader.java:76) ~[craftbukkit.jar:git-Spigot-26dfd01-5cb9b70]
在 org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:131) ~[craftbukkit.jar:git-Spigot-26dfd01-5cb9b70]
... 6 更多
由以下原因引起:java.lang.ClassNotFoundException:be.maximvdw.featherboard.api.PlaceholderAPI$PlaceholderRequestEventHandler
在 java.net.URLClassLoader$1.run(来源不明)~[?:1.8.0_25]
在 java.net.URLClassLoader$1.run(来源不明)~[?:1.8.0_25]
在 java.security.AccessController.doPrivileged(本机方法)~[?:1.8.0_25]
在 java.net.URLClassLoader.findClass(未知来源)~[?:1.8.0_25]
在 org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:101) ~[craftbukkit.jar:git-Spigot-26dfd01-5cb9b70]
在 org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:86) ~[craftbukkit.jar:git-Spigot-26dfd01-5cb9b70]
在 java.lang.ClassLoader.loadClass(未知来源)~[?:1.8.0_25]
在 java.lang.ClassLoader.loadClass(未知来源)~[?:1.8.0_25]
在 (java:21) ~[?:?]
在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)~[?:1.8.0_25]
在 sun.reflect.NativeConstructorAccessorImpl.newInstance(未知来源)~[?:1.8.0_25]
在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(未知来源)~[?:1.8.0_25]
在 java.lang.reflect.Constructor.newInstance(未知来源)~[?:1.8.0_25]
在 java.lang.Class.newInstance(未知来源)~[?:1.8.0_25]
在 org.bukkit.plugin.java.PluginClassLoader.(PluginClassLoader.java:76) ~[craftbukkit.jar:git-Spigot-26dfd01-5cb9b70]
在 org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:131) ~[craftbukkit.jar:git-Spigot-26dfd01-5cb9b70]
... 6 更多
[15:44:32]
不是在依赖项存在时启用插件,而是在依赖项不存在时禁用插件。
if (getServer().getPluginManager().getPlugin("Plugin") != null) {
// error message, whatever else you need here
getServer().getPluginManager().disablePlugin(this);
}
编辑:我刚刚意识到这可能不是您想要做的。如果您尝试使用某个可能不在服务器上的插件的代码,例如在监听器中,请创建 2 个监听器 类:一个包含使用该插件的代码,另一个不包含来自那个插件。然后当你注册听众时,做这样的事情:
if (getServer().getPluginManager().getPlugin("Plugin") != null) {
getServer().getPluginManager().registerEvents(new ListenerWithDependencyCode(), this);
} else {
getServer().getPluginManager().registerEvents(new ListenerWithoutDependencyCode(), this);
}
我的 plugin.yml 有软依赖:
softdepend: [Plugin]
我使用这个检查插件是否不在服务器中:
if(getServer().getPluginManager().getPlugin("Plugin") != null) {
// do stuff
}
即使我在 运行 安装我的代码之前检查插件文件夹中是否存在插件,我仍然从这个插件导入,当插件不在服务器上时会抛出错误。由于我从 softdepended 插件中导入,我得到了 InvalidPluginException
。如果插件文件夹中的插件可用,我需要将这些导入 运行 我使用的代码。注意:如果找不到 softdepend 插件,我不想禁用该插件。
如何保持从 softdepended 插件导入而不引发此错误。
我试过在 Bukkit 论坛和 Stack Overflow 上寻找类似的问题,但我没有运气。
错误如下所示:
org.bukkit.plugin.InvalidPluginException: java.lang.NoClassDefFoundError: be/maximvdw/featherboard/api/PlaceholderAPI$PlaceholderRequestEventHandler 在 org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:135) ~[craftbukkit.jar:git-Spigot-26dfd01-5cb9b70] 在 org.bukkit.plugin.SimplePluginManager.loadPlugin(SimplePluginManager.java:329) ~[craftbukkit.jar:git-Spigot-26dfd01-5cb9b70] 在 org.bukkit.plugin.SimplePluginManager.loadPlugins(SimplePluginManager.java:251) [craftbukkit.jar:git-Spigot-26dfd01-5cb9b70] 在 org.bukkit.craftbukkit.v1_8_R2.CraftServer.loadPlugins(CraftServer.java:291) [craftbukkit.jar:git-Spigot-26dfd01-5cb9b70] 在 net.minecraft.server.v1_8_R2.DedicatedServer.init(DedicatedServer.java:199) [craftbukkit.jar:git-Spigot-26dfd01-5cb9b70] 在 net.minecraft.server.v1_8_R2.MinecraftServer.run(MinecraftServer.java:522) [craftbukkit.jar:git-Spigot-26dfd01-5cb9b70] 在 java.lang.Thread.run(未知来源)[?:1.8.0_25] 由以下原因引起:java.lang.NoClassDefFoundError:be/maximvdw/featherboard/api/PlaceholderAPI$PlaceholderRequestEventHandler 在 (java:21) ~[?:?] 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)~[?:1.8.0_25] 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(未知来源)~[?:1.8.0_25] 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(未知来源)~[?:1.8.0_25] 在 java.lang.reflect.Constructor.newInstance(未知来源)~[?:1.8.0_25] 在 java.lang.Class.newInstance(未知来源)~[?:1.8.0_25] 在 org.bukkit.plugin.java.PluginClassLoader.(PluginClassLoader.java:76) ~[craftbukkit.jar:git-Spigot-26dfd01-5cb9b70] 在 org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:131) ~[craftbukkit.jar:git-Spigot-26dfd01-5cb9b70] ... 6 更多 由以下原因引起:java.lang.ClassNotFoundException:be.maximvdw.featherboard.api.PlaceholderAPI$PlaceholderRequestEventHandler 在 java.net.URLClassLoader$1.run(来源不明)~[?:1.8.0_25] 在 java.net.URLClassLoader$1.run(来源不明)~[?:1.8.0_25] 在 java.security.AccessController.doPrivileged(本机方法)~[?:1.8.0_25] 在 java.net.URLClassLoader.findClass(未知来源)~[?:1.8.0_25] 在 org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:101) ~[craftbukkit.jar:git-Spigot-26dfd01-5cb9b70] 在 org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:86) ~[craftbukkit.jar:git-Spigot-26dfd01-5cb9b70] 在 java.lang.ClassLoader.loadClass(未知来源)~[?:1.8.0_25] 在 java.lang.ClassLoader.loadClass(未知来源)~[?:1.8.0_25] 在 (java:21) ~[?:?] 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)~[?:1.8.0_25] 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(未知来源)~[?:1.8.0_25] 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(未知来源)~[?:1.8.0_25] 在 java.lang.reflect.Constructor.newInstance(未知来源)~[?:1.8.0_25] 在 java.lang.Class.newInstance(未知来源)~[?:1.8.0_25] 在 org.bukkit.plugin.java.PluginClassLoader.(PluginClassLoader.java:76) ~[craftbukkit.jar:git-Spigot-26dfd01-5cb9b70] 在 org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:131) ~[craftbukkit.jar:git-Spigot-26dfd01-5cb9b70] ... 6 更多 [15:44:32]
不是在依赖项存在时启用插件,而是在依赖项不存在时禁用插件。
if (getServer().getPluginManager().getPlugin("Plugin") != null) {
// error message, whatever else you need here
getServer().getPluginManager().disablePlugin(this);
}
编辑:我刚刚意识到这可能不是您想要做的。如果您尝试使用某个可能不在服务器上的插件的代码,例如在监听器中,请创建 2 个监听器 类:一个包含使用该插件的代码,另一个不包含来自那个插件。然后当你注册听众时,做这样的事情:
if (getServer().getPluginManager().getPlugin("Plugin") != null) {
getServer().getPluginManager().registerEvents(new ListenerWithDependencyCode(), this);
} else {
getServer().getPluginManager().registerEvents(new ListenerWithoutDependencyCode(), this);
}