AI 摘要

宝宝读完啦! 讲的是Leaves服务器的事情。有个Mixin开关,打开后插件可以改改改Java代码。但是为了用Aki-Async插件,要打开这个开关。 从1.20.5开始,Paper换了新地图(Mojang Mappings)。如果太早打开Mixin开关,Paper会乱乱,重映射失败,结果零个插件加载出来! 这是什么呀?看报错看报错,是PluginRemapper出问题啦。 然后然后,要先删掉.paper-remapped文件夹,关掉开关启动一次,让Paper缓存缓存插件。哇,存好了!再打开开关,就一切正常啦!这里超厉害!

Leaves核心提供 -Dleavesclip.enable.mixin=true 参数,开启后插件可以在运行时修改 Java 类的行为。

因为要使用Aki-Async 异步优化插件,所以添加了这个启动参数。

-Dleavesclip.enable.mixin=trueLeaves 核心(LeavesMC)的一个 JVM 启动参数,用于启用 Mixin 支持

问题复现

从 Minecraft 1.20.5 开始,Paper 服务端改为在运行时直接使用 Mojang 官方映射(Mojang Mappings),而不是传统的 Spigot 映射。

Paper对插件重映射之前将 -Dleavesclip.enable.mixin=true 参数添加到启动核心的命令中,会导致插件重映射失败。

[18:43:01 ERROR]: [EntrypointUtil] Self-suppression not permitted
java.lang.IllegalArgumentException: Self-suppression not permitted
    at java.base/java.lang.Throwable.addSuppressed(Throwable.java:1096) ~[?:?]
    at net.minecraft.util.ExceptionCollector.add(ExceptionCollector.java:13) ~[?:?]
    at io.papermc.paper.pluginremap.PluginRemapper.waitForAll(PluginRemapper.java:422) ~[?:?]
    at io.papermc.paper.pluginremap.PluginRemapper.rewritePluginDirectory(PluginRemapper.java:210) ~[?:?]
    at io.papermc.paper.plugin.provider.source.DirectoryProviderSource.prepareContext(DirectoryProviderSource.java:42) ~[?:?]
    ...

插件加载结果:

[18:43:01 INFO]: [PluginInitializerManager] Initialized 0 plugins
#  由于重映射失败,0 个插件被加载。服务端继续启动,但没有插件。

查关键词PluginRemapper可以查到一堆issue,可以确定Leaves是基于Paper的分支,肯定继承了相同的问题。

测试

将 -Dleavesclip.enable.mixin=true 参数去掉后重新启动核心,所有插件便可以正常加载。那么可以确定就是这个Mixin导致插件重映射失败。

解决

.paper-remapped 目录主要用于:
缓存重映射后的插件 JAR —— 将使用 Spigot 映射编译的插件转换为 Mojang 映射版本
缓存服务端 JAR —— 存储重映射后的服务端核心文件
加速启动 —— 避免每次启动都重新处理这些文件,显著提升服务器启动速度

先删掉\plugins下的\.paper-remapped文件夹,将 -Dleavesclip.enable.mixin=true 参数去掉重新启动核心,缓存重映射后的插件JAR

关闭核心,重新将 -Dleavesclip.enable.mixin=true 参数加回启动脚本即可正常运行。