非Spring Boot项目集成Paper插件时@ComponentScan未扫描到自定义Bean问题
问题根因与解决方案
核心原因
Minecraft Paper服务端的插件使用独立的插件类加载器加载,和Spring默认使用的系统类加载器不属于同一个层级,Spring默认的组件扫描逻辑无法识别到插件Jar包内的自定义类,导致@ComponentScan失效。
修复方案
修改Subserver类中Spring上下文的初始化逻辑,不要直接用带配置类参数的构造方法初始化,改为手动指定类加载器后再刷新上下文:
@SneakyThrows @Override public void onEnable() { // 1. 先创建空的注解配置上下文 context = new AnnotationConfigApplicationContext(); // 2. 手动指定类加载器为当前插件的类加载器,确保Spring能扫描到插件内的类 context.setClassLoader(this.getClass().getClassLoader()); // 3. 注册配置类 context.register(BukkitSpringApplication.class); // 4. 手动刷新上下文完成初始化 context.refresh(); // 后续原有逻辑不变 System.out.println(context.getBeanDefinitionCount()); for (String beanName : context.getBeanDefinitionNames()) { System.out.println(beanName); } BukkitConfiguration bukkitConfiguration = context.getBean(BukkitConfiguration.class); bukkitConfiguration.startMinecraftPlugin(context, this); context.registerShutdownHook(); }
其他可排查项
- 确认打包后的插件Jar内确实存在
de.nebelniek.BukkitConfiguration类,避免打包过滤规则误删类文件 - 确认
@ComponentScan的包路径拼写完全正确,大小写与实际包结构一致 - 确认自定义的Bean类上都正确添加了
@Configuration/@Component/@Service等Spring托管注解
内容的提问来源于stack exchange,提问作者Jan Herzog
相关产品推荐
相关产品推荐

