You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spigot插件启动报IllegalArgumentException错误求助

问题分析:Spigot插件启动时的IllegalArgumentException错误

错误信息

[16:43:41] [Server thread/ERROR]: Error occurred while enabling CustomServer v1.0-SNAPSHOT (Is it up to date?)
java.lang.IllegalArgumentException: Invalid key. Must be [a-z0-9/._-]: Custom
        at com.google.common.base.Preconditions.checkArgument(Preconditions.java:220) ~[guava-31.1-jre.jar:?]
        at org.bukkit.NamespacedKey.<init>(NamespacedKey.java:84) ~[spigot-api-1.20-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.NamespacedKey.minecraft(NamespacedKey.java:175) ~[spigot-api-1.20-R0.1-SNAPSHOT.jar:?]
        at me.entropire.customserver.CustomServer.onEnable(CustomEntropireServer.java:30) ~[?:?]
        ...(后续错误栈省略)

相关代码(CoinBag类)

package me.user.customserver;

import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;

import java.io.*;
import java.util.Arrays;
import java.util.List;


public class CoinBag implements Listener {
    @EventHandler
    public void OnPlayerInterect(PlayerInteractEvent event) {
        Player player = event.getPlayer();

        if (player.getInventory().getItemInMainHand().getType() == Material.LEATHER_HORSE_ARMOR){
            if (player.getInventory().getItemInMainHand().getItemMeta().getCustomModelData() == 1015) {
                ItemMeta meta = player.getInventory().getItemInMainHand().getItemMeta();
                if (player.getInventory().getItemInMainHand().getItemMeta().hasLore()) {
                    String id = meta.getLore().toString();
                    id = id.replaceAll("C", "");
                    id = id.replaceAll("i", "");
                    id = id.replaceAll("o", "");
                    id = id.replaceAll("n", "");
                    id = id.replaceAll("b", "");
                    id = id.replaceAll("a", "");
                    id = id.replaceAll("g", "");
                    id = id.replaceAll(" ", "");
                    String fileName = id + ".yml";
                        Inventory inv = Bukkit.createInventory(player, 18, "CoinBag " + id);

                        File file = new File("plugins/CustomServer/" + fileName);
                        FileConfiguration config = YamlConfiguration.loadConfiguration(file);

                        if (file.exists()){
                            ItemStack[] contents = ((List<ItemStack>) config.get("CoinBag.contents")).toArray(new ItemStack[0]);
                            inv.setContents(contents);
                        }
                    player.openInventory(inv);

                }
            }
        }
    }

    @EventHandler
    private void onPlayerExitInv(InventoryCloseEvent e) throws IOException {
        if (e.getView().getTitle().contains("CoinBag")){

            String name_inv = e.getView().getTitle();
            name_inv = name_inv.replaceAll("C", "");
            name_inv = name_inv.replaceAll("i", "");
            name_inv = name_inv.replaceAll("o", "");
            name_inv = name_inv.replaceAll("n", "");
            name_inv = name_inv.replaceAll("B", "");
            name_inv = name_inv.replaceAll("a", "");
            name_inv = name_inv.replaceAll("g", "");
            name_inv = name_inv.replaceAll(" ", "");
            ItemStack[] contants = e.getInventory().getContents();

            String fileName = name_inv + ".yml";

            File file = new File("plugins/CustomServer/" + fileName);
            FileConfiguration c = YamlConfiguration.loadConfiguration(file);
            c.set("CoinBag.contents", contants);
            c.save(file);
        }
    }
}

错误根源分析

错误的核心原因不在CoinBag类的id = id.replaceAll(" ", "");或name_inv = name_inv.replaceAll(" ", "");两行,而是来自CustomServer类onEnable方法的第30行代码:

错误栈明确显示,问题出在调用NamespacedKey.minecraft("Custom")时,传入的字符串"Custom"不符合Spigot对NamespacedKey的命名规则——要求key只能包含小写字母(a-z)、数字(0-9)以及/ . _ -这些符号,而"Custom"中的大写字母C违反了该规则,直接触发了IllegalArgumentException。

你移除那两行后错误消失属于巧合(比如插件加载流程中其他逻辑未执行到错误代码,或服务器缓存影响),但这两行代码本身是用于处理CoinBag的ID字符串,和启动时的错误完全无关,移除后自然会导致插件功能异常。

修复方案:找到CustomServer类中创建NamespacedKey的代码,将"Custom"改为全小写的"custom",符合命名规范即可解决启动错误。

内容的提问来源于stack exchange,提问作者Entropire

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 20:05:29