# Spring-Boot-Plugin **Repository Path**: clann/Spring-Boot-Plugin ## Basic Information - **Project Name**: Spring-Boot-Plugin - **Description**: No description available - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 10 - **Forks**: 2 - **Created**: 2019-08-28 - **Last Updated**: 2024-05-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 基于SpringBoot的Minecraft插件开发框架 # 交流QQ群 628496236 # 项目架构 src: SpringBoot启动入口类,以及一些资源文件 lib_xxx: 为了避免与其他插件冲突,更改特定库的包路径 sbc_bukkit: 会暴露在bukkit环境中,由PluginClassLoader进行加载,对其他bukkit插件可见 sbp_remap: sbp和sbp插件实现多版本兼容的核心逻辑,由PluginClassLoader进行加载 以下module中的类,都对bukkit插件不可见,只能在sbp环境下使用 sbp_api: 接口规范,所有基于sbp开发的插件,都只应调用这个module里面的接口(其他module里的接口,不保证不随版本变化) sbp_plugin: sbp_api的实现,此模块内可以调用bukkit api,禁止直接调用cb和nms接口 sbp_plugin_all: 可以直接调用所有cb和nms接口.简简单单就能进行多版本兼容的可以写在这里 sbp_plugin_vxxx: 目的是,在sbp_reamp不能完成多版本兼容时,多版本兼容比较负载,就在这里实现. 部分bukkit api的差异也可以在这里实现 module_xxx: sbp自带一些特殊的功能模块 # jar包结构 在完成bootJar打包后,会使用shell脚本来调整jar包结构,实现remap和被bukkit加载 1. 将plugin.yml,sbp_bukkit的类,sbp_remap的类,slf4j-api的类调整到jar的根路径 2. 替换spring-boot-loader默认的ClassLoader,从而实现remap 调整完后的jar结构 ``` +--- META-INF | +--- maven/* | \--- MANIEST.MF | +--- plugin.yml | +--- SpringBootPluginSystem.properties | +--- BOOT-INF | +--- lib/* | +--- classes | +--- src中的主类 | +--- sbp/资源文件 | \--- application.properties | +--- sbp_bukkit的类 | +--- slf4j-api的类 | +--- sbp_remap的类 | +--- asm的类 | +--- spring-boot-loader的类 ``` # 服务端安装SBP和 将SBP放到plugins里 将SBP插件放到plugins/springbootplugin/plugins里 # 指令 重载指定插件的配置: /springboot reload # 开发 [文档](https://gitee.com/clann/Spring-Boot-Plugin/blob/master/doc/wiki.MD) 插件开发时,需要依赖 SpringBootPlugin-dev 一个插件开发样例: https://gitee.com/clann/SpringBootExamplePlugin # 笔记 NMSReflectUtils反射工具,直接使用你开发环境看到的名字即可.框架会自动加载映射规则,把你给的名字转换成运行时的名字 NMSClasses缓存了一些常用的nms类 CraftClasses缓存了一些常用的Craft类 获取SpringBootPlugin的bukkit插件实例,使用PluginUtils 获取SBP插件实例,使用PluginContext springbootplugin.datasource.enable为true时,就会按给定的配置启用druid数据源,并开启mybatis,javaMapper和xmlMapper都需要在插件包路径和mapper包下 启用了数据源时,会遍历所有 classpath*:ddl/createTable.sql 文件,并执行里面的sql. 主要用来建表. 建表语句要使用 CREATE TABLE IF NOT EXISTS ddl/createTable.sql中有多条sql时,用单独一的一行 -- 来分隔比如 sql1;\n--\nsql2 sql操作时,尽量异步进行 SBP的数据源是全局的,每个插件的表,尽量以插件id开头,避免表名冲突 所有@Component名字尽量唯一,避免beanName冲突 # TODO # 已知不支持的核心 1. Contigo 1.1 slf4j日志无法使用 Class.forName("org.slf4j.impl.StaticLoggerBinder"); // ok StaticLoggerBinder.getSingleton().getLoggerFactory(); // ok StaticLoggerBinder.getSingleton().getLoggerFactory().getLogger("root").info("11"); // ok LoggerFactory.getLogger("root"); // 绑定失败,先重置LoggerFactory也失败 1.2 NashornScriptEngine无法使用 ```java NashornScriptEngineFactory factory = null; Iterator var2 = (new ScriptEngineManager(System.class.getClassLoader())).getEngineFactories().iterator(); while(var2.hasNext()) { ScriptEngineFactory f = (ScriptEngineFactory)var2.next(); LOGGER.info("available script engine:" + f.getEngineName()); if (f.getEngineName().equalsIgnoreCase("Oracle Nashorn")) { // f.getClass().getName() -> jdk.nashorn.api.scripting.NashornScriptEngineFactory // 下面这行报错 factory = (NashornScriptEngineFactory)f; break; } } ```