自身去重(多 jar 选一)
基本信息
| 属性 | 值 |
|---|---|
| 类型 | 特殊机制(core mod 加载期自检) |
| 入口 | GTNHExtLibCore.injectData(core/GTNHExtLibCore.java:111) |
| 签名资源 | META-INF/gtnhextlib_deps.json |
| 日志 logger | GTNHExtLib |
行为
GTNHExtLib 是 core mod(gradle.properties 的 coreModClass = core.GTNHExtLibCore)。
若 mods 目录里被塞进了多份 GTNHExtLib jar,本机制保证只有一份真正生效,另一份从
FML 的 core mod 扫描结果里摘掉,避免重复引导 DeLoader / 重复改类加载器。
识别同族 jar
findExtLibJars(core/GTNHExtLibCore.java:147-163)遍历 LaunchClassLoader 的所有源 URL,
把 jar: / !/ 前缀剥掉、只保留 file: 且能正常打开的 jar(urlToJarFile,core/GTNHExtLibCore.java:165-182),
然后逐个开 JarFile,只要含有 META-INF/gtnhextlib_deps.json 就算同族(core/GTNHExtLibCore.java:155)。
- 若同族 jar 数量
<= 1,直接返回,不做任何事(core/GTNHExtLibCore.java:124-126)。 - 开发环境(
coremodLocation不是File)直接返回(core/GTNHExtLibCore.java:114-117)。
胜出规则
pickWinner(core/GTNHExtLibCore.java:184-191)按以下顺序排序,取第一个:
| 优先级 | 判据 | 实现 |
|---|---|---|
| 1(最高) | 版本号大者胜 | 读 jar Manifest 的 Implementation-Version,parseSemver 只取数字 major.minor.patch(先截掉 - 与 + 后缀),逐段比较;读不到按 0.0.0(core/GTNHExtLibCore.java:193-235) |
| 2 | fat jar 胜 | jar 内含任意 META-INF/falsepatternlib_repo/it/unimi/dsi/fastutil/ 条目(core/GTNHExtLibCore.java:38、core/GTNHExtLibCore.java:237-243) |
| 3 | 文件名字典序小者胜 | thenComparing(File::getName) |
落败者处理
suppressFromModScan(core/GTNHExtLibCore.java:246-258)反射改写 FML 内部状态:
从 CoreModManager.reparsedCoremods 移除落败者文件名,并确保它出现在 loadedCoremods 中
(不在则补进去),使其被当作已加载而不被再次扫描。
日志
- 落败:
Multiple GTNHExtLib jars detected; suppressing this one ({落败者}) in favour of {胜出者} - 胜出:
Multiple GTNHExtLib jars detected; this one ({本jar}) wins - 异常:
GTNHExtLib self-dedup failed(core/GTNHExtLibCore.java:137-139,吞掉异常不致命)
相关条目
- 类加载器例外与 DeLoader 引导 — 同一 core mod 静态块里做的另一件事