ModCandidateV2Sorter
基本信息
| 属性 | 值 |
|---|---|
| 类 | com.mitchej123.jarjar.discovery.ModCandidateV2Sorter<T extends SortableCandidate> |
| 类型 | 泛型排序器 |
| 输入 | Collection<T> + Comparator<T> |
| 输出 | Optional<List<T>>:成功返回排序后的 list,失败返回 empty |
| 来源 | RFB (RetroFuturaBootstrap) |
ModCandidateV2Sorter 是 JarJar 的核心排序器,调度三个阶段:
handleDuplicates()—— 重复 mod 去重 + coremod 豁免- 排序 —— 用传入的 Comparator(mod 阶段
MOD_COMPARATOR,coremod 阶段COREMOD_COMPARATOR) computeClasspathOrder()—— API 所有权拓扑排序
resolve 流程
public Optional<List<T>> resolve() {
handleDuplicates();
try {
if (criticalIssuesFound) return Optional.empty();
if (comparator != null) candidates.sort(comparator);
classpathOrder = computeClasspathOrder();
return Optional.of(candidates);
} finally {
releaseEarlyScan();
}
}
criticalIssuesFound 在 handleDuplicates 中设为 true 当抛出 LoaderException —— 同 jar 多 mod id 的 Multi-Release JAR 问题。
字段
| 字段 | 类型 | 说明 |
|---|---|---|
candidates |
List<T> |
工作集 |
disabled |
Set<T> (IdentityHashMap) |
已被去重标记的候选 |
criticalIssuesFound |
boolean |
致命问题标志 |
comparator |
Comparator<T> |
排序规则(coremod 可传 null) |
classpathOrder |
List<T> |
API 拓扑排序结果 |
getClasspathOrder
public List<T> getClasspathOrder() {
return classpathOrder != null ? classpathOrder : candidates;
}
CoreModManagerV2.loadTweakersAndCoreMods 用此方法获取按 API 所有权拓扑排序后的 classpath 顺序。
handleDuplicates
详见 重复 mod 去重。关键点:
- 同 id 不同 jar → 保留最高版本
- 同 id 同 jar → 抛 LoaderException
- CoremodExemptions 中登记的 coremod → 跳过整批
computeClasspathOrder
详见 API 所有权排序。Kahn 算法 + 环检测 fallback。
releaseEarlyScan
private void releaseEarlyScan() {
for (T c : candidates) {
if (c instanceof ModCandidateV2) ((ModCandidateV2) c).releaseEarlyScanData();
}
}
finally 块保证即使 criticalIssuesFound 也会清理 earlyPackages / declaredApiPackages。
相关条目
- 重复 mod 去重 - handleDuplicates 实现
- API 所有权排序 - computeClasspathOrder 实现
- Coremod 豁免清单 - handleDuplicates 引用
- ModCandidateV2 数据模型 - T extends SortableCandidate
- LoaderV2 -
MOD_COMPARATOR传入方 - CoreModManagerV2 -
COREMOD_COMPARATOR传入方