ClasspathModCandidateFinder

基本信息

属性 值
类 com.mitchej123.jarjar.fml.common.discovery.finder.ClasspathModCandidateFinder
接口 ModCandidateFinder
用途 把 Minecraft jar 与相关源文件作为 mod 候选提交给 ParallellModDiscoverer

ClasspathModCandidateFinder 扫描 ModClassLoader.getParentSources()(即 Minecraft 自身的 jar/zip 与 classpath 上的相关文件),过滤掉已知库/已加载 coremod 后,输出为 candidate。每个 source 被标记 isClasspath=true。

findCandidates 流程

public void findCandidates(ModCandidateConsumer out) {
    LOGGER.info("Searching for classpath mods");
    List<String> knownLibraries = ImmutableList.<String>builder()
        .addAll(modClassLoader.getDefaultLibraries())
        .addAll(CoreModManager.getLoadedCoremods())
        .addAll(CoreModManager.getReparseableCoremods())
        .build();
    final File[] minecraftSources = modClassLoader.getParentSources();
    if (minecraftSources.length == 1 && minecraftSources[0].isFile()) {
        FMLLog.fine("Minecraft is a file at %s, loading", minecraftSources[0].getAbsolutePath());
        out.accept(Collections.singletonList(minecraftSources[0].toPath()), true, true, true);
    } else {
        for (int i = 0; i < minecraftSources.length; i++) {
            if (minecraftSources[i].isFile()) {
                if (knownLibraries.contains(minecraftSources[i].getName()) || DefaultLibraries.isDefaultLibrary(minecraftSources[i])) {
                    FMLLog.finer("Skipping known library file %s", minecraftSources[i].getAbsolutePath());
                } else {
                    FMLLog.fine("Found a minecraft related file at %s, examining for mod candidates", minecraftSources[i].getAbsolutePath());
                    out.accept(Collections.singletonList(minecraftSources[i].toPath()), true, i == 0, true);
                }
            } else if (minecraftSources[i].isDirectory()) {
                FMLLog.fine("Found a minecraft related directory at %s, ignoring", minecraftSources[i].getAbsolutePath());
            }
        }
    }
}

过滤规则

类型 跳过
defaultLibraries(Forge 自带) 是
loadedCoremods 是
reparseableCoremods 是
DefaultLibraries 命中任一前缀 是
第一个 source(即真正的 Minecraft jar) 始终输出,isMinecraft=true
后续 source(非默认库) 输出,i==0? isMinecraft : false

输出标志

标志 值 含义
requiresRemap true classpath 阶段 jar 都视为需要重映射
isMinecraft true(仅首个) 标记为 Minecraft jar
isClasspath true 标记为 classpath 阶段 jar

ParallellModDiscoverer.ModScanTask 用这些标志构造 ModCandidateV2(classPathJar, ..., isMinecraft, isClasspath)。

与 ParallellModDiscoverer 协作

ParallellModDiscoverer 构造函数第一个 finder 即 ClasspathModCandidateFinder(modClassLoader),保证 Minecraft jar 在 Directory finder 之前被处理。

相关条目