Ява.ленг.NoSuchMethodError, когда он явно существует
Общая Информация: Я использую API Bukkit/Spigot в версии git-Spigot-1d14d5f-ba32592 (MC: 1.8.3) (реализация API версии 1.8.3-R0.1-SNAPSHOT), IntelliJ IDEA 14.1.3 и компиляция с компилятором по умолчанию. Версия java jdk-1.8.0_25.
поэтому, когда я пытаюсь вызвать конструктор этого класса, он выдает исключение времени выполнения из заголовка.
класс меню инвентаризации
package me.lakan.util.inventory;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
import java.util.HashMap;
import java.util.Map;
@SuppressWarnings("unused") // Util functionality is not always used
public class InventoryMenu implements Listener {
private InventoryType type;
private String title;
private Map<Integer, MenuOption> options;
// Constructors
public InventoryMenu(InventoryType type, String title, JavaPlugin plugin) {
this.options = new HashMap<Integer, MenuOption>();
this.type = type;
this.title = title;
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}
public boolean addOption(int position, MenuOption option) {
boolean res = isPosEmpty(position);
this.options.put(position, option);
return res;
}
public void addOption(String name, int position, ItemStack icon) {
addOption(position, new MenuOption(icon, name));
}
public boolean isPosEmpty(int position) {
return !this.options.containsKey(position);
}
public void openFor(Player p) {
// Create a new inventory
Inventory inv = Bukkit.createInventory(p, this.type, this.title);
// Fill all icons at their positions
for (Map.Entry<Integer, MenuOption> key : this.options.entrySet()) {
inv.setItem(key.getKey(), key.getValue().getIcon());
}
// If the inventory is a player inventory, update the player's
if (inv.getType() == InventoryType.PLAYER) {
p.getInventory().setContents(inv.getContents());
}
// For any openable inventory, just open it up
else {
p.openInventory(inv);
}
}
/**
* Listens for inventory clicks
* If the inventory is a menu:
* - Cancel movement
* - Push event
* - Close inventory if it should
* @param e The actual event
*/
@EventHandler(priority = EventPriority.HIGHEST)
public void onInventoryClick(InventoryClickEvent e) {
// Prevent clicking if this inventory was clicked
if (e.getClickedInventory().getName().equals(this.title)) {
e.setCancelled(true);
// Check for option
if (this.options.containsKey(e.getRawSlot())) {
// Get the option for this slot
MenuOption option = this.options.get(e.getRawSlot());
// Fill out an event and push it
MenuClickEvent event = new MenuClickEvent((Player) e.getWhoClicked(), true, option.getName(), e.getRawSlot());
Bukkit.getServer().getPluginManager().callEvent(event);
// Now close inventory if not cancelled
if (event.willCLose()) {
e.getWhoClicked().closeInventory();
}
}
}
}
@SuppressWarnings("unused")
public interface OptionClickEventHandler {
public void onOptionClick(MenuClickEvent event);
}
}
меню пункт класс!--9-->
package me.lakan.test;
import me.lakan.util.inventory.InventoryMenu;
import me.lakan.util.inventory.MenuClickEvent;
import me.lakan.util.inventory.MenuOption;
import me.lakan.util.item.ItemBuilder;
import org.apache.commons.lang.Validate;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryType;
public class ItemMenu implements Listener {
private PluginEntry plugin;
private InventoryMenu menu;
// Commands
private TestCommand testCmd;
public ItemMenu(PluginEntry plugin) {
Validate.notNull(this.plugin, "The plugin reference may not be null");
this.plugin = plugin;
this.menu = new InventoryMenu(InventoryType.CHEST, "" + ChatColor.DARK_GRAY + "Abilities", this.plugin);
// Test
this.menu.addOption(1,
new MenuOption(
new ItemBuilder()
.amount(1)
.material(Material.RAW_FISH)
.name(ChatColor.LIGHT_PURPLE + "Test")
.lore(ChatColor.WHITE + "Click me")
.build(),
"TestIdentifier"));
this.testCmd= new TestCmd(this.plugin);
}
public void openFor(Player p) {
this.menu.openFor(p);
}
@EventHandler(priority = EventPriority.NORMAL)
public void onOptionClick(MenuClickEvent e) {
// Test
if (e.getName().equals("TestIdentifier")) {
this.testCmd.executeFor(e.getWhoClicked());
}
}
}
трассировка стека исключений
[12:48:25] [Server thread / ERROR]: произошла ошибка при включении теста v1.0 (обновлено ли оно?)
Ява.ленг.NoSuchMethodError: меня.лакановской.утиль.инвентаризация.InventoryMenu.(Лорг/наказывает/мероприятия/инвентаризация/InventoryType;Ljava/Lang в/последовательность;Лорг/наказывает/плагин/Ява/JavaPlugin;)в
на меня.лакановской.тест.Итеммену.(ItemMenu.java: 33) ~[?:?]
на меня.лакановской.тест.CommandParser.(CommandParser.java: 20) ~[?:?]
на мне.лакановской.тест.PluginEntry.onEnable (PluginEntry.java: 21) ~[?:?]
в орг.под Bukkit.плагин.Ява.JavaPlugin.setEnabled(JavaPlugin.java: 321) ~[spigot_server.опарник:Git-Spigot-1d14d5f-ba32592]
в орг.под Bukkit.плагин.Ява.JavaPluginLoader.enablePlugin (JavaPluginLoader.java: 335) [spigot_server.опарник:Git-Spigot-1d14d5f-ba32592]
в орг.под Bukkit.плагин.SimplePluginManager.enablePlugin (SimplePluginManager.java: 405) [spigot_server.опарник:Git-Spigot-1d14d5f-ba32592]
на орг.под Bukkit.craftbukkit.v1_8_R2.CraftServer.функцией loadplugin(CraftServer.java: 356) [spigot_server.опарник:Git-Spigot-1d14d5f-ba32592]
в орг.под Bukkit.craftbukkit.v1_8_R2.CraftServer.enablePlugins (CraftServer.java: 316) [spigot_server.опарник:Git-Spigot-1d14d5f-ba32592]
в Net.Майнкрафт.сервер.v1_8_R2.MinecraftServer.r (MinecraftServer.java: 416) [spigot_server.опарник:Git-Spigot-1d14d5f-ba32592]
в Net.Майнкрафт.сервер.v1_8_R2.MinecraftServer.k (MinecraftServer.java: 382) [spigot_server.опарник:Git-Spigot-1d14d5f-ba32592]
в Net.Майнкрафт.сервер.v1_8_R2.MinecraftServer.a (MinecraftServer.java: 337) [spigot_server.опарник:Git-Spigot-1d14d5f-ba32592]
в Net.Майнкрафт.сервер.v1_8_R2.DedicatedServer.init (DedicatedServer.java: 257) [spigot_server.опарник:Git-Spigot-1d14d5f-ba32592]
в Net.Майнкрафт.сервер.v1_8_R2.MinecraftServer.run (MinecraftServer.java: 522) [spigot_server.опарник:Git-Spigot-1d14d5f-ba32592]
на Яве.ленг.Нитка.запустить(неизвестный источник) [?:1.8.0_31]
package me.lakan.test;
import me.lakan.util.inventory.InventoryMenu;
import me.lakan.util.inventory.MenuClickEvent;
import me.lakan.util.inventory.MenuOption;
import me.lakan.util.item.ItemBuilder;
import org.apache.commons.lang.Validate;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryType;
public class ItemMenu implements Listener {
private PluginEntry plugin;
private InventoryMenu menu;
// Commands
private TestCommand testCmd;
public ItemMenu(PluginEntry plugin) {
Validate.notNull(this.plugin, "The plugin reference may not be null");
this.plugin = plugin;
this.menu = new InventoryMenu(InventoryType.CHEST, "" + ChatColor.DARK_GRAY + "Abilities", this.plugin);
// Test
this.menu.addOption(1,
new MenuOption(
new ItemBuilder()
.amount(1)
.material(Material.RAW_FISH)
.name(ChatColor.LIGHT_PURPLE + "Test")
.lore(ChatColor.WHITE + "Click me")
.build(),
"TestIdentifier"));
this.testCmd= new TestCmd(this.plugin);
}
public void openFor(Player p) {
this.menu.openFor(p);
}
@EventHandler(priority = EventPriority.NORMAL)
public void onOptionClick(MenuClickEvent e) {
// Test
if (e.getName().equals("TestIdentifier")) {
this.testCmd.executeFor(e.getWhoClicked());
}
}
}
[12:48:25] [Server thread / ERROR]: произошла ошибка при включении теста v1.0 (обновлено ли оно?) Ява.ленг.NoSuchMethodError: меня.лакановской.утиль.инвентаризация.InventoryMenu.(Лорг/наказывает/мероприятия/инвентаризация/InventoryType;Ljava/Lang в/последовательность;Лорг/наказывает/плагин/Ява/JavaPlugin;)в
на меня.лакановской.тест.Итеммену.(ItemMenu.java: 33) ~[?:?] на меня.лакановской.тест.CommandParser.(CommandParser.java: 20) ~[?:?] на мне.лакановской.тест.PluginEntry.onEnable (PluginEntry.java: 21) ~[?:?] в орг.под Bukkit.плагин.Ява.JavaPlugin.setEnabled(JavaPlugin.java: 321) ~[spigot_server.опарник:Git-Spigot-1d14d5f-ba32592] в орг.под Bukkit.плагин.Ява.JavaPluginLoader.enablePlugin (JavaPluginLoader.java: 335) [spigot_server.опарник:Git-Spigot-1d14d5f-ba32592] в орг.под Bukkit.плагин.SimplePluginManager.enablePlugin (SimplePluginManager.java: 405) [spigot_server.опарник:Git-Spigot-1d14d5f-ba32592] на орг.под Bukkit.craftbukkit.v1_8_R2.CraftServer.функцией loadplugin(CraftServer.java: 356) [spigot_server.опарник:Git-Spigot-1d14d5f-ba32592] в орг.под Bukkit.craftbukkit.v1_8_R2.CraftServer.enablePlugins (CraftServer.java: 316) [spigot_server.опарник:Git-Spigot-1d14d5f-ba32592] в Net.Майнкрафт.сервер.v1_8_R2.MinecraftServer.r (MinecraftServer.java: 416) [spigot_server.опарник:Git-Spigot-1d14d5f-ba32592] в Net.Майнкрафт.сервер.v1_8_R2.MinecraftServer.k (MinecraftServer.java: 382) [spigot_server.опарник:Git-Spigot-1d14d5f-ba32592] в Net.Майнкрафт.сервер.v1_8_R2.MinecraftServer.a (MinecraftServer.java: 337) [spigot_server.опарник:Git-Spigot-1d14d5f-ba32592] в Net.Майнкрафт.сервер.v1_8_R2.DedicatedServer.init (DedicatedServer.java: 257) [spigot_server.опарник:Git-Spigot-1d14d5f-ba32592] в Net.Майнкрафт.сервер.v1_8_R2.MinecraftServer.run (MinecraftServer.java: 522) [spigot_server.опарник:Git-Spigot-1d14d5f-ba32592] на Яве.ленг.Нитка.запустить(неизвестный источник) [?:1.8.0_31]
Как вы можете видеть конструктор есть, и насколько я знаю, правильно называется. Так это ошибка в моей настройке проекта, API-вещь или что-то совсем другое?
классы утилит находятся в отдельном модуле, и все работает, если я вставляю их в модуль тестового плагина, но не внутри другого модуля. Однако любой другой конструктор в любом другом классе внутри меня.лакановской.утиль.инвентарь можно назвать обычно.
1 ответов
проблема была в структуре проекта.
для тестового артефакта я выбрал модуль модуля util. Изменение его на выходной артефакт модуля util исправлено.