自身去重(多 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,吞掉异常不致命)

相关条目