本帖最后由 RarityEG 于 2021-5-10 00:05 编辑
复制代码Forge 的库必须先被加入到 ClassPath
@dengyu @hzwcyq @whatfilmae @Jaanai @叉烧 @洞穴夜莺 @🔥❄️ @小默米 @🐦💕🌸🌸 @bleake @🌱⛄🐏
每周快照是 Alicorn 启动器的测试机制,主要用于 |
然而,每周快照主要用于新特性展示,通常存在大量漏洞。因此对于普通用户建议仅做测试尝鲜用。启动前请务必进行备份和检查更新。非正式版的功能远远不及设计标准,仅供参考。 |
不要转载本帖,因为会致使他人对本帖进行 |
该模板魔改自 【新闻资讯版】版规|模板代码 |
Downloads 下载
如果您已经开启了自动更新(在终端中输入 update enable),您无需下载以下文件,只需重启启动器并稍等几分钟。
经过上百次实验和参数分析,Forge 终于投降了,现在您可以在核心安装页面安装 Forge 以及在启动台启动 Forge 引导的核心了!

有关 Forge 的坑详见下文
ChangeLog 更新内容
- [ TESTING ] Forge 核心下载与自动安装
- [ ACCEPTED ] Forge 核心启动
- [ ACCEPTED ] 少量翻译修复,感谢 @wood-man
- [ ACCEPTED ] 优化了路由加载速度
It Ain't Easy Handling Forge
Forge,你为何和我过不去?
Forge 的坑真的是非常大。Alicorn 早就有 Forge 启动的功能,但是一直没有成功。
今天我重新打开这个 Issue,对比了我们生成的启动参数和官启生成的参数
没有任何差别
(均是 59 个依赖库)
后来我仔细看了一下报错,发现这样的问题。
Mojang 使用 Log4j 2.8,而 Forge 使用 2.11
Forge 的 Mixin 会向 ThrowableProxy 类的一个方法进行修改
那么问题在哪里呢?
修复这个 Bug 只需要修改一行代码:
- retGF.libraries = gfHead.libraries.concat(retGF.libraries);
(太累了,我要休息了,就不详细说了,Bye!)
THE END
@dengyu @hzwcyq @whatfilmae @Jaanai @叉烧 @洞穴夜莺 @🔥❄️ @小默米 @🐦💕🌸🌸 @bleake @🌱⛄🐏
烫手,这是啃了块硬骨头啊!

想必下了很多功夫吧
顺便,这么晚还不睡吗(恼)
顺便,这么晚还不睡吗(恼)
我在想是不是可以等正式版出来之后看到楼主拿到绊线钩?(逃
本帖最后由 xmdhs 于 2021-5-10 00:33 编辑
和先后顺序应该没关系吧,我是先把原版的 libraries 加进去,再读 forge 的 json 把 forge 的 libraries 加进去。
大概是这样
复制代码
而且 libraries 其实有共性,无论是原版还是 forge 和 fabric,都有 libraries.[].name 。解析这个就可以不用管什么 forge 还是 fabric 了。当然,下载还是得多写点代码,我这的方法是判断,然后转化成 1.15 原版的 json 的数据结构,然后只需要多写转换的代码了。
兼容性可能不是最佳,但是就像是用百分之二十的内容,覆盖百分之八十的场景,还是挺舒服的。
和先后顺序应该没关系吧,我是先把原版的 libraries 加进去,再读 forge 的 json 把 forge 的 libraries 加进去。
大概是这样
- if mod.InheritsFrom != "" {
- b, err := ioutil.ReadFile(g.Minecraftpath + `/versions/` + mod.InheritsFrom + "/" + mod.InheritsFrom + ".json")
- if err != nil {
- if os.IsNotExist(err) {
- return nil, fmt.Errorf("Gameinfo.modjson: %w", err)
- }
- panic(fmt.Errorf("Gameinfo.modjson: %w", err))
- }
- err = json.Unmarshal(b, &j)
- if err != nil {
- return nil, JsonErr
- }
- for _, v := range mod.Libraries {
- l := g.libraries2LibraryX115(v)
- j.Libraries = append(j.Libraries, l)
- }
- g.Version = mod.ID
- j.MainClass = mod.MainClass
- if len(mod.Arguments.Game) != 0 {
- j.Arguments.Game = append(j.Arguments.Game, mod.Arguments.Game...)
- }
- if mod.MinecraftArguments != "" {
- j.Arguments.Game = append(j.Arguments.Game, minecraftArguments2jvm(mod.MinecraftArguments)...)
- j.Arguments.Jvm = append(j.Arguments.Jvm, getjvm()...)
- }
- }
而且 libraries 其实有共性,无论是原版还是 forge 和 fabric,都有 libraries.[].name 。解析这个就可以不用管什么 forge 还是 fabric 了。当然,下载还是得多写点代码,我这的方法是判断,然后转化成 1.15 原版的 json 的数据结构,然后只需要多写转换的代码了。
兼容性可能不是最佳,但是就像是用百分之二十的内容,覆盖百分之八十的场景,还是挺舒服的。
本帖最后由 RarityEG 于 2021-5-10 06:47 编辑
我生成的参数和标准参数就只有顺序区别
我的参数启动的游戏的报错原因是一个Mixin出错
Forge向org.apache.log4j.core.impl.ThrowableProxy的一个方法进行Mixin
这个方法在2.8中没有,只有2.11才有,Mojang用2.8,Forge用2.11
Java查找Class的时候会根据ClassPath依次寻找
所以必须把Forge的库放在前面,不然JVM优先找到2.8中的那个类结果又找不到那个方法,就炸掉了
这个问题在1.16.5上出现
xmdhs 发表于 2021-5-10 00:31
和先后顺序应该没关系吧,我是先把原版的 libraries 加进去,再读 forge 的 json 把 forge 的 libraries 加 ...
我生成的参数和标准参数就只有顺序区别
我的参数启动的游戏的报错原因是一个Mixin出错
Forge向org.apache.log4j.core.impl.ThrowableProxy的一个方法进行Mixin
这个方法在2.8中没有,只有2.11才有,Mojang用2.8,Forge用2.11
Java查找Class的时候会根据ClassPath依次寻找
所以必须把Forge的库放在前面,不然JVM优先找到2.8中的那个类结果又找不到那个方法,就炸掉了
这个问题在1.16.5上出现
是时候给开发板定个版本号规范了

RarityEG 发表于 2021-5-10 06:45
我生成的参数和标准参数就只有顺序区别
我的参数启动的游戏的报错原因是一个Mixin出错
Forge向org.apache. ...
我这用了 hashmap 去储存了 forge 的 libraries 的包名和版本,之后生成 cp 后那一串东西时,如果包名相同,版本不同就不会加进 cp。
所以生成后是这样的
- D:/mc/.minecraft/libraries/com/mojang/patchy/1.1/patchy-1.1.jar;
- D:/mc/.minecraft/libraries/oshi-project/oshi-core/1.1/oshi-core-1.1.jar;
- D:/mc/.minecraft/libraries/net/java/dev/jna/jna/4.4.0/jna-4.4.0.jar;
- D:/mc/.minecraft/libraries/net/java/dev/jna/platform/3.4.0/platform-3.4.0.jar;
- D:/mc/.minecraft/libraries/com/ibm/icu/icu4j/66.1/icu4j-66.1.jar;
- D:/mc/.minecraft/libraries/com/mojang/javabridge/1.0.22/javabridge-1.0.22.jar;
- D:/mc/.minecraft/libraries/io/netty/netty-all/4.1.25.Final/netty-all-4.1.25.Final.jar;
- D:/mc/.minecraft/libraries/com/google/guava/guava/21.0/guava-21.0.jar;
- D:/mc/.minecraft/libraries/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5.jar;
- D:/mc/.minecraft/libraries/commons-io/commons-io/2.5/commons-io-2.5.jar;
- D:/mc/.minecraft/libraries/commons-codec/commons-codec/1.10/commons-codec-1.10.jar;
- D:/mc/.minecraft/libraries/net/java/jinput/jinput/2.0.5/jinput-2.0.5.jar;
- D:/mc/.minecraft/libraries/net/java/jutils/jutils/1.0.0/jutils-1.0.0.jar;
- D:/mc/.minecraft/libraries/com/mojang/brigadier/1.0.17/brigadier-1.0.17.jar;
- D:/mc/.minecraft/libraries/com/mojang/datafixerupper/4.0.26/datafixerupper-4.0.26.jar;
- D:/mc/.minecraft/libraries/com/google/code/gson/gson/2.8.0/gson-2.8.0.jar;
- D:/mc/.minecraft/libraries/com/mojang/authlib/2.1.28/authlib-2.1.28.jar;
- D:/mc/.minecraft/libraries/org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1.jar;
- D:/mc/.minecraft/libraries/org/apache/httpcomponents/httpclient/4.3.3/httpclient-4.3.3.jar;
- D:/mc/.minecraft/libraries/commons-logging/commons-logging/1.1.3/commons-logging-1.1.3.jar;
- D:/mc/.minecraft/libraries/org/apache/httpcomponents/httpcore/4.3.2/httpcore-4.3.2.jar;
- D:/mc/.minecraft/libraries/it/unimi/dsi/fastutil/8.2.1/fastutil-8.2.1.jar;
- D:/mc/.minecraft/libraries/org/lwjgl/lwjgl/3.2.2/lwjgl-3.2.2.jar;
- D:/mc/.minecraft/libraries/org/lwjgl/lwjgl-jemalloc/3.2.2/lwjgl-jemalloc-3.2.2.jar;
- D:/mc/.minecraft/libraries/org/lwjgl/lwjgl-openal/3.2.2/lwjgl-openal-3.2.2.jar;
- D:/mc/.minecraft/libraries/org/lwjgl/lwjgl-opengl/3.2.2/lwjgl-opengl-3.2.2.jar;
- D:/mc/.minecraft/libraries/org/lwjgl/lwjgl-glfw/3.2.2/lwjgl-glfw-3.2.2.jar;
- D:/mc/.minecraft/libraries/org/lwjgl/lwjgl-stb/3.2.2/lwjgl-stb-3.2.2.jar;
- D:/mc/.minecraft/libraries/org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2.jar;
- D:/mc/.minecraft/libraries/org/lwjgl/lwjgl/3.2.2/lwjgl-3.2.2.jar;
- D:/mc/.minecraft/libraries/org/lwjgl/lwjgl-jemalloc/3.2.2/lwjgl-jemalloc-3.2.2.jar;
- D:/mc/.minecraft/libraries/org/lwjgl/lwjgl-openal/3.2.2/lwjgl-openal-3.2.2.jar;
- D:/mc/.minecraft/libraries/org/lwjgl/lwjgl-opengl/3.2.2/lwjgl-opengl-3.2.2.jar;
- D:/mc/.minecraft/libraries/org/lwjgl/lwjgl-glfw/3.2.2/lwjgl-glfw-3.2.2.jar;
- D:/mc/.minecraft/libraries/org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2.jar;
- D:/mc/.minecraft/libraries/org/lwjgl/lwjgl-stb/3.2.2/lwjgl-stb-3.2.2.jar;
- D:/mc/.minecraft/libraries/com/mojang/text2speech/1.11.3/text2speech-1.11.3.jar;
- D:/mc/.minecraft/libraries/com/mojang/text2speech/1.11.3/text2speech-1.11.3.jar;
- D:/mc/.minecraft/libraries/net/minecraftforge/forge/1.16.5-36.1.12/forge-1.16.5-36.1.12.jar;
- D:/mc/.minecraft/libraries/org/ow2/asm/asm/9.0/asm-9.0.jar;
- D:/mc/.minecraft/libraries/org/ow2/asm/asm-commons/9.0/asm-commons-9.0.jar;
- D:/mc/.minecraft/libraries/org/ow2/asm/asm-tree/9.0/asm-tree-9.0.jar;
- D:/mc/.minecraft/libraries/org/ow2/asm/asm-util/9.0/asm-util-9.0.jar;
- D:/mc/.minecraft/libraries/org/ow2/asm/asm-analysis/9.0/asm-analysis-9.0.jar;
- D:/mc/.minecraft/libraries/cpw/mods/modlauncher/8.0.9/modlauncher-8.0.9.jar;
- D:/mc/.minecraft/libraries/cpw/mods/grossjava9hacks/1.3.3/grossjava9hacks-1.3.3.jar;
- D:/mc/.minecraft/libraries/net/minecraftforge/accesstransformers/3.0.1/accesstransformers-3.0.1.jar;
- D:/mc/.minecraft/libraries/org/antlr/antlr4-runtime/4.9.1/antlr4-runtime-4.9.1.jar;
- D:/mc/.minecraft/libraries/net/minecraftforge/eventbus/4.0.0/eventbus-4.0.0.jar;
- D:/mc/.minecraft/libraries/net/minecraftforge/forgespi/3.2.0/forgespi-3.2.0.jar;
- D:/mc/.minecraft/libraries/net/minecraftforge/coremods/4.0.6/coremods-4.0.6.jar;
- D:/mc/.minecraft/libraries/net/minecraftforge/unsafe/0.2.0/unsafe-0.2.0.jar;
- D:/mc/.minecraft/libraries/com/electronwill/night-config/core/3.6.3/core-3.6.3.jar;
- D:/mc/.minecraft/libraries/com/electronwill/night-config/toml/3.6.3/toml-3.6.3.jar;
- D:/mc/.minecraft/libraries/org/jline/jline/3.12.1/jline-3.12.1.jar;
- D:/mc/.minecraft/libraries/org/apache/maven/maven-artifact/3.6.3/maven-artifact-3.6.3.jar;
- D:/mc/.minecraft/libraries/net/jodah/typetools/0.8.3/typetools-0.8.3.jar;
- D:/mc/.minecraft/libraries/org/apache/logging/log4j/log4j-api/2.11.2/log4j-api-2.11.2.jar;
- D:/mc/.minecraft/libraries/org/apache/logging/log4j/log4j-core/2.11.2/log4j-core-2.11.2.jar;
- D:/mc/.minecraft/libraries/net/minecrell/terminalconsoleappender/1.2.0/terminalconsoleappender-1.2.0.jar;
- D:/mc/.minecraft/libraries/net/sf/jopt-simple/jopt-simple/5.0.4/jopt-simple-5.0.4.jar;
- D:/mc/.minecraft/libraries/org/spongepowered/mixin/0.8.2/mixin-0.8.2.jar;
- D:/mc/.minecraft/libraries/net/minecraftforge/nashorn-core-compat/15.1.1.1/nashorn-core-compat-15.1.1.1.jar;
- D:/mc/.minecraft/versions/1.16.5/1.16.5.jar
看不懂,只能精神上支持一下楼主了

多么辛勤的楼主,凌晨了还在编程,我们应该多向楼主学习

xmdhs 发表于 2021-5-10 08:31
我这用了 hashmap 去储存了 forge 的 libraries 的包名和版本,之后生成 cp 后那一串东西时,如果包名相 ...
我明白了
你在把一个库push进来的时候检查了版本
- D:/mc/.minecraft/libraries/org/apache/logging/log4j/log4j-core/2.11.2/log4j-core-2.11.2.jar;
而Forge里面有log4j 2.11,Mojang 有2.8
然后你的启动器就用2.11替代了2.8
而我的启动器不检查版本,只会根据json指定的库进行处理
所以简而言之我们的解决方法是一样的,你是不加载2.8那个jar,而我是把2.8丢到2.11后面让2.11覆盖它
所以看上去和顺序有关系,其实就是一个版本问题
好耶 可惜还是没有 macOS 版本