大家好我是皇鱼,又复活了
今天我们讲一下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.jsoninstall_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.lzmadata/server.lzma,如果存在,分别解压至Lib路径:
net.minecraftforge:forge:{version}:clientdata@lzmanet.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进行转载。
最后修改:2025 年 07 月 03 日
如果觉得我的文章对你有用,请留言/点赞