类加载器例外与 DeLoader 引导

基本信息

属性 值
类型 特殊机制(core mod 类加载期)
入口 GTNHExtLibCore 静态块(core/GTNHExtLibCore.java:43-63)
coremod 声明 @IFMLLoadingPlugin.MCVersion("1.7.10")(core/GTNHExtLibCore.java:30)
Transformer 排除 com.gtnewhorizons.gtnhextlib、com.falsepattern.deploader、it.unimi.dsi.fastutil、org.joml、com.mojang.brigadier、xyz.wagyourtail.jvmdowngrader(core/GTNHExtLibCore.java:31-32)

行为

静态块在类被加载时即刻执行,顺序如下。

1. 改写 LaunchClassLoader 的类加载例外

反射取出 LaunchClassLoader.classLoaderExceptions 字段(core/GTNHExtLibCore.java:45-48):

  • 移除 com.mojang.——注释写明是 “for Brigadier”(core/GTNHExtLibCore.java:49-50)。 Brigadier 依赖 com.mojang.brigadier(dependencies.gradle 的 depload("com.mojang:brigadier:1.0.18")), 若不解除例外,DeLoader 下载的 brigadier 不会被委派加载。
  • hybrid server 判定:类路径上存在 org/bukkit/World.class(Bukkit)或 thermos/Thermos.class(core/GTNHExtLibCore.java:52-53)即认为是 hybrid 服务端; 此时加入 com.mojang.util.QueueLogAppender(core/GTNHExtLibCore.java:54-56), 注释标注用途为 “Thermos console log compat”。

字段反射失败(NoSuchFieldException / IllegalAccessException)会直接抛 RuntimeException 终止加载(core/GTNHExtLibCore.java:57-59),这是唯一的硬失败路径。

2. 引导 FalsePatternLib DeLoader

DeploaderStub.bootstrap(false) + DeploaderStub.runDepLoader()(core/GTNHExtLibCore.java:60-61), 让 DeLoader 按 META-INF/gtnhextlib_deps*.json 在运行期下载依赖,而不是把它们打进 jar。

DeLoader 清单(src/main/resources/META-INF/):

文件 生效条件 仓库
gtnhextlib_deps.json 默认 repo1.maven.org + libraries.minecraft.net
gtnhextlib_deps8.json maxJava: 16(Java 8/11/16) maven.wagyourtail.xyz
gtnhextlib_deps17.json minJava: 17 maven.wagyourtail.xyz

三份清单的 dependencies.always.common 均为 ["$DEPS"],由 Gradle 的 depload(...) 调用展开 (dependencies.gradle):fastutil 8.5.18、joml 1.10.8、brigadier 1.0.18、 jvmdowngrader-java-api 2.0.1 的 downgraded-8 与 downgraded-17 两版。

3. 随后

调用 mirrorJvmdgStubToSystemClassLoader()(core/GTNHExtLibCore.java:62)—— 详见 jvmdg stub 镜像到系统类加载器。

RFB 路径

GTNHExtLibRfbPlugin(core/rfb/GTNHExtLibRfbPlugin.java)走 RetroFuturaBootstrap 时 做等价但参数不同的事:DeploaderStub.bootstrap(true) + runDepLoader(), 并向兼容类加载器追加子委派前缀 xyz.wagyourtail.jvmdg.(core/rfb/GTNHExtLibRfbPlugin.java:14-18)。 它不提供任何类转换器(makeTransformers() 返回 null,core/rfb/GTNHExtLibRfbPlugin.java:24-26), 注册声明在 src/main/resources/META-INF/rfb-plugin/gtnhextlib.properties。

本 mod 没有的内容

不触碰任何游戏内容:net.minecraft.block / net.minecraft.item / net.minecraft.entity 包在 src/main/java 下各 0 命中;registerBlock / registerItem / registerEntity / registerTileEntity / GameRegistry / addCommand / keyBinding / Enchantment / BiomeGen / WorldProvider / Potion / Achievement 各 0 命中。

相关条目