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 内部消费;保留作为扩展点,供自定义工具链读取。
相关条目
- MetadataCollectionTransformer - 字节码层加别名
- FMLTransformer - 把
MetadataCollection.from调用重定向到 V2 - JarUtil 嵌套抽取与版本识别 - 主消费者