Bukkit API Soft Depend导入

时间:2015-10-10 23:06:04

标签: java eclipse bukkit

我的plugin.yml中有一个softdepend:

softdepend: [Plugin]

我使用以下方法检查插件是否在服务器中:

if(getServer().getPluginManager().getPlugin("Plugin") != null) {
  // do stuff
}

即使我在运行我的代码之前检查插件文件夹中是否存在该插件,我也会从该插件导入,当插件不在服务器上时会抛出错误。我得到一个InvalidPluginException,因为我从softdepended插件导入了。如果插件在plugins文件夹中可用,我需要这些导入来运行我使用的代码。注意:如果找不到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]     at net.minecraft.server.v1_8_R2.DedicatedServer.init(DedicatedServer.java:199)[craftbukkit.jar:git-Spigot-26dfd01-5cb9b70]     at 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     at(java:21)〜[?:?]     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)〜[?:1.8.0_25]     at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)〜[?:1.8.0_25]     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)〜[?:1.8.0_25]     at java.lang.reflect.Constructor.newInstance(Unknown Source)〜[?: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]     at java.security.AccessController.doPrivileged(Native Method)〜[?: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]     at(java:21)〜[?:?]     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)〜[?:1.8.0_25]     at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)〜[?:1.8.0_25]     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)〜[?:1.8.0_25]     at java.lang.reflect.Constructor.newInstance(Unknown Source)〜[?: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秒]

1 个答案:

答案 0 :(得分:1)

当依赖项存在时,不要启用插件,如果没有插件,请禁用该插件。

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);
}