在一般情况下,某个插件大更新时插件结构或多或少发生变化,甚至包名都发生了变化,最典型的例子就是MythicMobs的v4和v5版本。这种情况下即使两个版本插件全部当作依赖,项目也不会有什么问题。
MM v4获取物品的方法:
import io.lumine.xikage.mythicmobs.MythicMobs;
MythicBukkit.inst().getItemManager().getItemStack(itemID)
MM v5获取物品的方法:
import io.lumine.mythic.bukkit.MythicBukkit;
MythicMobs.inst().getItemManager().getItemStack(itemID)
另外一种情况则是包名发生变化,类名未发生变化,这种情况则直接不再使用import,例如EcoEnchants的v10和v11版本。
EE v10获取附魔的方法:
com.willfp.ecoenchants.enchant.EcoEnchants.INSTANCE.getByID(enchantment.getKey().getKey());
EE v11获取附魔的方法:
com.willfp.ecoenchants.enchants.EcoEnchants.getByKey(enchantment.getKey());
其中ecoenchants后,v11版本是enchants,v10版本是enchant,虽然最后类名一样,但是由于前面包名发生改变,通过这个手段项目也能分开两个版本的依赖。
最恐怖的当属包名、类名都未发生变化,但是类里面的方法进行了改变。
以MythicDungeons 1.2.2版本和MythicDungeons 1.3版本为例。
该插件的DungeonFunction类下存在一个方法:
public void runFunction(TriggerFireEvent triggerEvent, List targets) {
}
此方法中的TriggerFireEvent的包名发生了变化:
1.2.2版本:net.playavalon.mythicdungeons.api.events.TriggerFireEvent
1.3版本:net.playavalon.mythicdungeons.api.events.dungeon.TriggerFireEvent
1.3版本中events后多了dungeon,导致直接引用MythicDungeons依赖情况下,只能同时兼容一个版本,如果想要多版本兼容,则不太容易。
目前想到办法是编写一个假的MythicDungeons插件,在此假插件中,这个类会同时有1.2.2版本的runFunction和1.3版本的runFunction。

此后项目引用该假MythicDungeons版本,并将1.2.2版本兼容的代码和1.3版本兼容的代码分隔到两个不同的类中,在插件启用时检查插件版本号,并启用其中一个兼容类。
MM v4获取物品的方法:
import io.lumine.xikage.mythicmobs.MythicMobs;
MythicBukkit.inst().getItemManager().getItemStack(itemID)
MM v5获取物品的方法:
import io.lumine.mythic.bukkit.MythicBukkit;
MythicMobs.inst().getItemManager().getItemStack(itemID)
另外一种情况则是包名发生变化,类名未发生变化,这种情况则直接不再使用import,例如EcoEnchants的v10和v11版本。
EE v10获取附魔的方法:
com.willfp.ecoenchants.enchant.EcoEnchants.INSTANCE.getByID(enchantment.getKey().getKey());
EE v11获取附魔的方法:
com.willfp.ecoenchants.enchants.EcoEnchants.getByKey(enchantment.getKey());
其中ecoenchants后,v11版本是enchants,v10版本是enchant,虽然最后类名一样,但是由于前面包名发生改变,通过这个手段项目也能分开两个版本的依赖。
最恐怖的当属包名、类名都未发生变化,但是类里面的方法进行了改变。
以MythicDungeons 1.2.2版本和MythicDungeons 1.3版本为例。
该插件的DungeonFunction类下存在一个方法:
public void runFunction(TriggerFireEvent triggerEvent, List targets) {
}
此方法中的TriggerFireEvent的包名发生了变化:
1.2.2版本:net.playavalon.mythicdungeons.api.events.TriggerFireEvent
1.3版本:net.playavalon.mythicdungeons.api.events.dungeon.TriggerFireEvent
1.3版本中events后多了dungeon,导致直接引用MythicDungeons依赖情况下,只能同时兼容一个版本,如果想要多版本兼容,则不太容易。
目前想到办法是编写一个假的MythicDungeons插件,在此假插件中,这个类会同时有1.2.2版本的runFunction和1.3版本的runFunction。

此后项目引用该假MythicDungeons版本,并将1.2.2版本兼容的代码和1.3版本兼容的代码分隔到两个不同的类中,在插件启用时检查插件版本号,并启用其中一个兼容类。