大家好我是皇鱼,又复活了
今天我们讲一下Forge的安装与启动
那么开始
非常感谢bmclapi使我的下载速度提升
*开始之前确保你安装了对应的原版Minecraft
判断是否是新版安装器
在上一篇文章中已经获取了Forge安装器的jar,由于Forge的安装器的安装流程等被修改过,所以我们需要对不同版本的安装器进行区分。
首先关于1.5.1以下干脆没有安装器的版本就不讨论了,可以去翻其它启动器源码。
本节内容参考ProjBobCat
首先,你需要获得你安装的版本的forge的artifact版本字符串
首先你需要通过点分你的mc版本,这里以major.minor.build为例。
注:满足其中一个条件后直接跳过后面的条件,按顺序判断
如果你的minor为8,且build也为8或为空,则使用{mc版本}-{forge版本}; //1.8.8, 1.8
如果你的minor为7或8,则使用{mc版本}-{forge版本}-{mc版本}; //1.7-1.8, 1.8.9
如果不满足上述条件,使用{mc版本}-{forge版本}。 //1.8.9+
获得了artifact版本字符串后,你需要在安装器jar解压(或使用压缩包库直接操作)并搜索有没有forge-{artifact版本字符串}-universal.jar
如果有,那么就是旧版安装器。如果没有,那么就是新版安装器。
本文将讲解新版安装器的安装方法,旧版安装器将于下一篇文章讲解
安装前准备
该节参考自Forge-InstallProcessor.NET
你需要将安装器解压到一个临时目录,或者直接使用压缩包库进行操作,这样会更方便。
首先,提取安装器目录下version.json和install_profile.json,提取libraries数组,按原版方式解析并下载。
部分版本可能存在空的url,忽略即可。
processors
文件位置
接下来,我们要开始运行processor,提取install_profile内的processors数组,其每一项格式大体为:
{
"sides": [
"server"
],
"jar": "net.minecraftforge:installertools:1.4.3",
"classpath": [
"net.sf.jopt-simple:jopt-simple:6.0-alpha-3",
"com.google.code.gson:gson:2.10.1",
"de.siegmar:fastcsv:2.2.2",
"net.minecraftforge:srgutils:0.5.10",
"org.ow2.asm:asm-commons:9.7",
"org.ow2.asm:asm-tree:9.7",
"org.ow2.asm:asm:9.7"
],
"args": [
"--task",
"BUNDLER_EXTRACT",
"--input",
"{MINECRAFT_JAR}",
"--output",
"{ROOT}/libraries/",
"--libraries"
]
},你需要提取sides,如果该项不存在或存在且包含client,则说明这是客户端侧需要执行的processor。
首先,你需要根据jar中的内容,找到该安装器的路径,具体方法:
首先,以:分割字符串,第一项为包名,第二项为名称,第三项以及之后的所有项都为版本号。
首先,提取包名,将其中的.替换为路径分隔符/;
然后,提取名称,附加在刚刚的路径上,同时再附加一个路径分隔符;
接着,提取第一个版本号,即第三项,附加到刚刚的路径上,再附加一个路径分隔符;
最后,从名称,也就是第二项开始,以-为分割,将往后的每一项都加上去。
接下来你需要判断文件扩展名,首先寻找最后一项有没有@符号,如果没有,那么文件扩展名就是.jar。
如果有,那么文件扩展名为@后的内容,如1.21@zip,即1.21.zip。
在最前面加上libraries文件夹路径,就可以了。
后面将这种路径统称为Lib路径
示例代码:
private static string GetLibPath(string lib)
{
var sp = lib.Split(":");
if (sp.Length < 3) return null;
var package = sp[0];
var name = sp[1];
var ver = sp[2];
var res = package.Replace(".", "/") + "/";
res += name + "/";
res += ver + "/";
for (int i = 1; i < sp.Length; i++)
{
res += sp[i] + "-";
}
res = res.Substring(0, res.Length - 1);
var ext = ".jar";
if (lib.Contains("@"))
{
ext = $"{lib.Substring(lib.LastIndexOf('@') + 1)}";
}
res += $".{ext}";
res = ".minecraft\\libraries\\" + res;
return res;
}
主类名
在获得文件位置后,你需要通过jar文件获取主类名。
同上,你需要解压/使用压缩库操作jar文件
jar文件的信息一般在META-INF/MANIFEST.MF内,遍历这个文件的每一行,找到Main-Class:开头的行,Main-Class:后的内容就是主类名。
处理classpath
读取classpath数组,里面所有内容都是Lib路径,转换为实际文件路径后以;分割即可。
处理参数
读取args数组,以空格为分割,将每一项都附加上去。
其中,有的项可能被{}或[]包裹起来,这说明你需要将他们替换。
替换大括号及中括号参数
这二者本质一样,都是Lib路径
首先有几个固定值:
MINECRAFT_JAR : 版本jar路径
BINPATCH : 解析Lib路径 net.minecraftforge:forge:{forge版本}:clientdata@lzma
INSTALLER : 安装器jar路径
SIDE : client
ROOT : .minecraft文件夹路径如果不在固定值内,那么查找install_profile.json内的data.<key>.client(key为大括号内的内容),
如果查找出来的结果被[]包裹,那么你需要将中括号去掉,然后按照Lib路径的方式解析它。
下载MOJMAP
如果在--task参数后面的参数是DOWNLOAD_MOJMAPS,你当然可以让他自己下载,但是这耗时较长且无法使用镜像源。你需要自己下载,读取原版版本json的downloads.client_mappings,自行下载到install_profile内的data.MOJMAPS.client,并忽略这个processor。
提取LZMA文件
查找安装器压缩包内的data/client.lzma和data/server.lzma,如果存在,分别解压至Lib路径:net.minecraftforge:forge:{version}:clientdata@lzma和net.minecraftforge:forge:{version}:serverdata@lzma,这里的version是forge版本。
运行processor
生成启动命令:
{java.exe路径} -jar {processor路径} -cp {classpath} {主类名} {args数组内的参数}然后运行,执行完成后获取返回码,如果为0,就代表成功。
启动高版本Forge
将版本json与forge的版本json(安装器内的version.json)合并,遵循如下规则:
1.合并libraries,forge的libraries在后
2.mainClass使用forge
3.参数使用二者合并
4.其他项目以forge为准,若为列表,则forge在后
5.id项改为版本名
这样比较文明(xD)
你可能需要生成一份launcher_profile.json,这会在后面的文章中讲解,现在只需要使用之前的文章中给的默认的即可。
接下来,按照原版启动即可,需要对生成的classpath参数进行去重。。
未完待续
(下一篇先不讲解低版本Forge安装,而是讲解Optifine安装)
参考资料
Minecraft Wiki:https://zh.minecraft.wiki
Forge:https://files.minecraftforge.net/
BMCLAPI:https://bmclapidoc.bangbang93.com/
PCL2源码:https://github.com/Hex-Dragon/PCL2
TT702的ForgeProcessor处理器:https://github.com/TT702/Forge-InstallProcessor.NET/
Corona-Studio的启动器核心:https://github.com/Corona-Studio/ProjBobcat/
最后修改:2025-06-17 02:09
本文链接:https://blog.huangyu.win/index.php/archives/48/
版权声明:本文 如何编写一个Minecraft Java版启动器 | Part 3 高版本Forge安装与启动 | 3-3 为 皇鱼 原创。著作权归作者所有,如无特殊声明,本文将依据CC BY-NC-SA 4.0发布,请注意版权。
转载说明:请依据CC BY-NC-SA 4.0进行转载。

2 条评论
是否可以直接将forge的version.json与原版的json合并,下载依赖后启动呢?
不能,你还需要运行Forge的processors,在安装完成后再进行合并才能启动