MetadataCollectionV2

基本信息

属性 值
类 com.mitchej123.jarjar.fml.common.MetadataCollectionV2
父类 cpw.mods.fml.common.MetadataCollection
Gson 注册 ArtifactVersion → ArtifactVersionAdapter

MetadataCollectionV2 扩展原版 MetadataCollection.from(InputStream, String),支持 mcmod.info 顶层是数组或对象两种格式,并且能解析 modListVersion: 2 风格的扩展字段(含 jars 嵌套 jar 列表)。

字段

字段 类型 说明
jars String[] 嵌套 jar 文件路径列表

from 流程

public static MetadataCollection from(InputStream inputStream, String sourceName) {
    if (inputStream == null) return new MetadataCollection();

    InputStreamReader reader = new InputStreamReader(inputStream);
    try {
        final MetadataCollectionV2 collection;
        final JsonElement rootElement = PARSER.parse(reader);
        if (rootElement.isJsonArray()) {
            collection = new MetadataCollectionV2();
            final JsonArray jsonList = rootElement.getAsJsonArray();
            collection.modList = new ModMetadata[jsonList.size()];
            collection.jars = new String[0];
            int i = 0;
            for (JsonElement mod : jsonList) {
                collection.modList[i++] = GSON.fromJson(mod, ModMetadata.class);
            }
        } else {
            collection = GSON.fromJson(rootElement, MetadataCollectionV2.class);
            if (collection.jars == null) collection.jars = new String[0];
        }
        collection.parseModMetadataList();
        return collection;
    } catch (JsonParseException e) {
        FMLLog.log(Level.ERROR, e, "The mcmod.info file in %s cannot be parsed as valid JSON. It will be ignored", sourceName);
        return new MetadataCollectionV2();
    } catch (NullPointerException e) {
        FMLLog.log(Level.ERROR, e, "The mcmod.info file in %s is invalid. It will be ignored", sourceName);
        return new MetadataCollectionV2();
    } catch (Exception e) {
        throw Throwables.propagate(e);
    }
}
顶层结构 处理
JSON 数组 直接按顺序填 modList[i],jars = []
JSON 对象 Gson 反序列化为 MetadataCollectionV2(含 modList + jars)

两种格式都支持 —— 兼容老式 Forge 工具链(数组)与新版(modListVersion: 2 对象)。

与 MetadataCollectionTransformer 配合

MetadataCollectionTransformer 给 MetadataCollection.modList 加 @SerializedName 别名(modlist/ModList),允许 Gson 识别驼峰变体;MetadataCollectionV2 处理顶层结构差异。两者覆盖 mcmod.info 的两个常见解析失败路径。

与 JarUtil 协同

JarUtil.examineJarCandidate:

final JarEntry modInfoEntry = jar.getJarEntry("mcmod.info");
final MetadataCollection meta;
if (modInfoEntry != null) {
    meta = MetadataCollection.from(jar.getInputStream(modInfoEntry), modFile.getName());
} else {
    meta = MetadataCollection.from(null, "");
}
modCandidate.setMetadataCollection(meta);

无 mcmod.info 时 MetadataCollection.from(null, "") 返回空 MetadataCollection,guessVersion fallback 到文件名正则。

getJars

public String[] getJars() { return jars; }

当前未在 JarJar 内部消费;保留作为扩展点,供自定义工具链读取。

相关条目