Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

启动命令长度可能会超过 8191 个字符,从而无法启动游戏 #1013

Closed
huanghongxun opened this issue Sep 10, 2021 · 8 comments

Comments

@huanghongxun
Copy link
Collaborator

Windows 限制单个命令长度不能超过 8191 个字符,其中包含环境变量展开后的长度。
目前所见案例是 authlib-injector 的 prefetched 参数长度可能过长。但如果玩家将 Minecraft 放在深度过大的文件夹中也可能触发该问题。所以需要在游戏崩溃后/启动前弹出参数过长提示。

@Glavo
Copy link
Member

Glavo commented Sep 10, 2021

Java 可以通过 类似 java @mc.vmoptions 的形式读取文件 mc.vmoptions 中的 JVM 参数。可以考虑在 Windows 上对于过长命令生成一个临时文件存放 JVM 参数,并用 @ 传递给 JVM。

@Glavo
Copy link
Member

Glavo commented Sep 10, 2021

Java 可以通过 类似 java @mc.vmoptions 的形式读取文件 mc.vmoptions 中的 JVM 参数。可以考虑在 Windows 上对于过长命令生成一个临时文件存放 JVM 参数,并用 @ 传递给 JVM。

啊,发现 Java 8 不支持,我看看还有没有替代办法。

@Glavo
Copy link
Member

Glavo commented Sep 10, 2021

另一个缓解方案,用 builder.environment().put("CLASSPATH", ...) 传递类路径,以此缩短命令长度。

但根据微软文档所说,环境变量也会受到 8191 限制,该方案只能作为缓解措施,让 CLASSPATH 能够达到 8191 极限,但不能完全解决问题。

环境变量受到 32767 字符限制,该限制应该足够宽裕。

@Glavo
Copy link
Member

Glavo commented Sep 10, 2021

对于导出启动脚本,或许可以考虑允许用户选择生成 .ps1 的 PowerShell 脚本,PowerShell 中命令长度限制似乎被放宽至 32767 字符。

@yushijinhun
Copy link
Collaborator

  1. classpath 可以考虑使用相对路径缩短参数长度
  2. authlib-injector prefetch 的问题已经在解决,见 [proposal] 使用临时文件传递预获取的元数据 yushijinhun/authlib-injector#136

@Glavo
Copy link
Member

Glavo commented Sep 10, 2021

破案了,ProcessBuilder 底层用的 CreateProcess 本身只受 32767 限制,但是因为支持了线程优先级,所以这里手动调用了 CMD:

https://github.com/huanghongxun/HMCL/blob/fd246b7bc61562d13aeb084ccb081cec2b8703bd/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java#L77

这个是导致路径过长问题的根源。

@huanghongxun
Copy link
Collaborator Author

  1. classpath 可以考虑使用相对路径缩短参数长度
  2. authlib-injector prefetch 的问题已经在解决,见 [proposal] 使用临时文件传递预获取的元数据 yushijinhun/authlib-injector#136

无法使用相对路径,因为有些 Mod 通过相对路径访问文件夹,假设了当前路径是gameDir,这个无法改变。

Glavo added a commit to Glavo/HMCL that referenced this issue Sep 12, 2021
@Glavo
Copy link
Member

Glavo commented Oct 16, 2021

#1105 中修复,应该可以关闭了。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants