类加载器例外与 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 命中。
相关条目
- 自身去重(多 jar 选一) — 同一 core mod 加载期做的自检
- jvmdg stub 镜像到系统类加载器 — 静态块的最后一步