Class PluginManager

java.lang.Object
com.ultikits.ultitools.manager.PluginManager

public class PluginManager extends Object
UltiTools plugin manager.

UltiTools模块管理器

  • Field Details

  • Constructor Details

    • PluginManager

      public PluginManager()
  • Method Details

    • init

      public void init(ClassLoader classLoader) throws IOException
      Initialize plugin manager. Please do not call this method manually.
      初始化插件管理器。请不要手动调用此方法。
      Throws:
      IOException - IO exception
      IO异常
    • register

      public boolean register(Class<? extends UltiToolsPlugin> pluginClass)
      Register plugin.
      注册插件。
      Parameters:
      pluginClass - Plugin class
      插件类
      Returns:
      Register result
      注册结果
    • register

      public boolean register(Class<? extends UltiToolsPlugin> pluginClass, String pluginName, String version, List<String> authors, List<String> loadAfter, int minUltiToolsVersion, String mainClass)
      Register plugin.
      注册插件。
      Parameters:
      pluginClass - UltiTools plugin class
      UltiTools模块类
      pluginName - Plugin name
      插件名称
      version - Plugin version
      插件版本
      authors - Plugin authors
      插件作者
      loadAfter - Load after plugins
      加载在此插件之后的插件
      minUltiToolsVersion - Min UltiTools version
      最低UltiTools版本
      mainClass - Main class
      主类
      Returns:
      Register result
      注册结果
    • register

      public boolean register(UltiToolsPlugin plugin)
      Parameters:
      plugin - UltiTools plugin instance
      UltiTools模块实例
      Returns:
      Register result
      注册结果
    • unregister

      public void unregister(UltiToolsPlugin plugin)
      Parameters:
      plugin - UltiTools plugin instance
      UltiTools模块实例
    • close

      public void close()
      Unregister all plugins.
      注销所有插件。
    • registerPlayerQuitListener

      private void registerPlayerQuitListener()
      Register a Bukkit listener for PlayerQuitEvent to clean up @PlayerCache maps.
      注册 Bukkit 监听器,在玩家退出时清理 @PlayerCache 标注的 Map。
    • registerPluginDisableListener

      private void registerPluginDisableListener()
      Register a Bukkit listener for PluginDisableEvent to auto-disconnect external plugins.
      注册 Bukkit 监听器,在外部插件禁用时自动断开连接。
      Since:
      6.2.2
    • reload

      public void reload()
      Reload all plugins. This operation only reload plugin configuration.
      重载所有插件。此操作仅会重新加载插件配置。
    • loadPluginMainClass

      private Class<? extends UltiToolsPlugin> loadPluginMainClass(ClassLoader classLoader, File pluginJar)
      Load module main class.
      加载模块主类。
      Parameters:
      classLoader - Class loader
      类加载器
      pluginJar - Plugin jar file
      模块jar文件
      Returns:
      Plugin main class
      模块主类
    • validateJarFile

      private boolean validateJarFile(File jarFile)
      Validate jar file security.
      验证jar文件安全性。
      Parameters:
      jarFile - jar file to validate
      要验证的jar文件
      Returns:
      true if valid, false otherwise
      如果有效则为true,否则为false
    • passesCompatibilityGates

      private boolean passesCompatibilityGates(UltiToolsPlugin plugin)
      Compatibility gates that must run before the module's bean graph is built.
      必须跑在模块 bean 图构建之前的兼容性门禁。

      这两道门禁原先跑在 initializePlugin 之后,也就是容器 refresh()、整张 bean 图连同 @PostConstruct 都已经跑完之后。倒置的后果正好落在它们唯一有意义的 场景上:针对更新 API 编译的模块,恰恰是那种 bean 会引用不存在方法的模块,它会先死在 refresh() 里,被通用 catch 报成一条普通的初始化失败,而「UltiTools 版本过旧」 那句友好提示永远说不出口。见 issue #184。

      门禁只读 plugin.yml 里来的元数据(api-version / main / version),这些在实例构造完就已经就位,不需要容器。

      Parameters:
      plugin - freshly constructed plugin instance, context not yet attached
      刚构造出来、还没挂上容器的插件实例
      Returns:
      true if the module may proceed to context construction
      允许继续建容器则为 true
    • hasNewerVersionLoaded

      private boolean hasNewerVersionLoaded(UltiToolsPlugin plugin)
      判定是否已经加载了同一模块的更新版本。**只判定,不改动已加载的模块。**

      卸掉被本次加载取代的旧版本是另一件事,见 unregisterSupersededVersions(com.ultikits.ultitools.abstracts.UltiToolsPlugin)。 两者拆开是因为判定要提前到 bean 构造之前,而卸载不能——提前卸载会让「新版本初始化失败」 变成「服务器上两个版本都没有」。

    • unregisterSupersededVersions

      private void unregisterSupersededVersions(UltiToolsPlugin plugin)
      卸掉被本次加载取代的旧版本。

      只能在新模块的 registerSelf() 返回 true 之后调用——不是「容器建好之后」。 两者差着一步:容器建好只说明 bean 图能构造,模块尚未激活;而 registerSelf() 返回 false 或抛异常时,调用方会关掉新容器。若旧版本已经在此之前被卸,这个模块就 两头落空,而它原本正在正常运行。

    • isUltiToolsVersionCompatible

      private boolean isUltiToolsVersionCompatible(UltiToolsPlugin plugin)
    • attemptPluginRegistration

      private boolean attemptPluginRegistration(UltiToolsPlugin plugin)
    • onPluginRegistered

      private void onPluginRegistered(UltiToolsPlugin plugin)
    • registerModuleEventHandlers

      private void registerModuleEventHandlers(EventBus eventBus, UltiToolsPlugin plugin, Object bean)
      Scan a bean for @ModuleEventHandler methods and register them with the EventBus.
    • initializePlugin

      private UltiToolsPlugin initializePlugin(ClassLoader classLoader, Class<? extends UltiToolsPlugin> pluginClass, Object... constructorArgs)
      Initialize module.
      初始化模块。
      Parameters:
      classLoader - Class loader
      类加载器
      pluginClass - Plugin class
      插件类
      constructorArgs - Constructor arguments
      构造器参数
      Returns:
      the initialized module, or null if a compatibility gate rejected it
      初始化好的模块;被兼容性门禁拒绝时返回 null
    • validateConstructorArgs

      private boolean validateConstructorArgs(Object... args)
      Validate constructor arguments for security.
      验证构造器参数的安全性。
      Parameters:
      args - constructor arguments
      构造器参数
      Returns:
      true if safe, false otherwise
      如果安全则为true,否则为false
    • isSafeParameterType

      private boolean isSafeParameterType(Class<?> clazz)
      Check if parameter type is safe for constructor injection.
      检查参数类型是否对构造器注入安全。
      Parameters:
      clazz - parameter class
      参数类
      Returns:
      true if safe, false otherwise
      如果安全则为true,否则为false
    • registerBukkit

      private void registerBukkit(UltiToolsPlugin plugin, boolean flag)
      Register bukkit commands or listeners.
      注册Bukkit命令或监听器。
      Parameters:
      plugin - UltiTools module instance
      UltiTools模块实例
      flag - True if register in default package
      如果在默认包中注册则为true
    • setPluginStaticInstance

      private void setPluginStaticInstance(Class<? extends UltiToolsPlugin> pluginClass, UltiToolsPlugin plugin)
      Set the static instance field on a plugin class before @PostConstruct runs. Most modules follow the pattern: private static XxxPlugin instance; This enables @PostConstruct methods to call Xxx.getInstance().getDataOperator() etc.
      在 @PostConstruct 运行之前设置插件类的静态 instance 字段。
      Parameters:
      pluginClass - the plugin class
      插件类
      plugin - the plugin instance
      插件实例
    • getPluginScanPackages

      private String[] getPluginScanPackages(Class<? extends UltiToolsPlugin> pluginClass)
      Get scan packages for a plugin class. Reads from @UltiToolsModule or @ComponentScan annotations, defaults to plugin class package.
      获取插件类的扫描包。
      Parameters:
      pluginClass - plugin class
      插件类
      Returns:
      scan packages
      扫描包
    • sortPluginsByDependencies

      private List<Class<? extends UltiToolsPlugin>> sortPluginsByDependencies(List<Class<? extends UltiToolsPlugin>> plugins)
      Sort plugins by their dependencies using Kahn's algorithm (topological sort).
      使用 Kahn 算法(拓扑排序)按依赖关系对插件进行排序。
      Parameters:
      plugins - list of plugin classes to sort
      要排序的插件类列表
      Returns:
      sorted list of plugin classes
      排序后的插件类列表
    • registerExternal

      public void registerExternal(ExternalPluginAdapter adapter)
      Register an external Bukkit plugin adapter with the framework. Creates an IoC container, scans for annotated components, and registers commands/listeners/tasks.

      注册外部 Bukkit 插件适配器到框架中。 创建 IoC 容器,扫描注解组件,并注册命令、监听器和定时任务。

      Parameters:
      adapter - the external plugin adapter
      Since:
      6.2.2
    • unregisterExternal

      public void unregisterExternal(ExternalPluginAdapter adapter)
      Unregister an external Bukkit plugin adapter from the framework. Tears down the IoC container, unregisters commands/listeners, and cleans up resources.

      从框架中注销外部 Bukkit 插件适配器。 拆除 IoC 容器,注销命令和监听器,并清理资源。

      Parameters:
      adapter - the external plugin adapter
      Since:
      6.2.2
    • registerModuleEventHandlersExternal

      private void registerModuleEventHandlersExternal(EventBus eventBus, String pluginName, Object bean)
      Scan a bean for @ModuleEventHandler methods and register them with EventBus for an external plugin.