ModCandidateV2Sorter

基本信息

属性 值
类 com.mitchej123.jarjar.discovery.ModCandidateV2Sorter<T extends SortableCandidate>
类型 泛型排序器
输入 Collection<T> + Comparator<T>
输出 Optional<List<T>>:成功返回排序后的 list,失败返回 empty
来源 RFB (RetroFuturaBootstrap)

ModCandidateV2Sorter 是 JarJar 的核心排序器,调度三个阶段:

  1. handleDuplicates() —— 重复 mod 去重 + coremod 豁免
  2. 排序 —— 用传入的 Comparator(mod 阶段 MOD_COMPARATOR,coremod 阶段 COREMOD_COMPARATOR)
  3. 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。

相关条目