Skip to content

[Feature]: 启动器 Java 检测与管理逻辑流程 #81

@HsiangNianian

Description

@HsiangNianian

前置确认

  • 我理解 Issue 是用于反馈和解决问题的,而非吐槽评论区,将尽可能提供更多信息
  • 我未仔细阅读这些内容,只是一键已读所有内容,并相信这不会影响问题的处理
  • 我已搜索现有 Issue,确认这不是重复的功能请求
  • 我已查看 README 中的 Roadmap
  • 这个功能将使多个用户受益,而不仅仅是我自己

功能类型

Java 管理

问题陈述

现状分析

目前启动器的 java 检测逻辑和十分混乱且并没有覆盖常用的目录并且管理手段匮乏(除了额外安装以外几乎没有)。

建议的解决方案

目标
实现一套跨平台、高可靠性的 Java 运行环境检测机制,支持自动搜索系统已安装的 Java,并允许用户自定义 Java 目录。

检测流程

  • 步骤 A:路径收集

    • Windows:
      • 扫描注册表 HKLM\SOFTWARE\JavaSoft 及其子项。
      • 扫描环境变量 PATHJAVA_HOME
      • 扫描默认目录:C:\Program Files\Java\
    • macOS:
      • 执行 /usr/libexec/java_home -V 命令获取列表。
      • 扫描 /Library/Java/JavaVirtualMachines/
    • Linux:
      • 扫描 /usr/lib/jvm//opt/ 下的常见 JDK 目录。
      • 解析 which java 指向的软链接。
  • 步骤 B:有效性校验与信息提取

    • 针对收集到的每一个 java 可执行文件路径,执行一个轻量级的 Java 程序(如 JavaCheck.jar)或运行 java -XshowSettings:properties -version
    • 需提取的关键字段
      1. Version: 识别主版本号(8, 11, 17, 21 等)以匹配 Minecraft 版本需求。
      2. Architecture: 区分 x86x64,避免在 64 位系统上错误使用 32 位 Java 导致内存分配受限。
      3. Vendor: 识别供应商(Oracle, Temurin, Microsoft 等)方便用户排查兼容性问题。
  • 步骤 C:自定义路径处理

    • 提供“浏览”按钮允许用户手动选择 javajavaw
    • 对用户选择的路径强制执行 步骤 B 的校验,只有验证能成功运行且返回有效版本信息的路径才允许保存。

数据结构建议

{
  "java_installations": [
    {
      "path": "C:/Program Files/Java/jdk-17/bin/javaw.exe",
      "version": "17.0.2",
      "arch": "x64",
      "vendor": "Eclipse Adoptium",
      "is_recommended": true
    }
  ],
  "user_defined_path": "/home/user/my-java/bin/java"
}

启动逻辑优先级

  1. 如果用户在实例设置中开启了“覆盖 Java 路径”,优先使用该路径。
  2. 否则使用启动器全局设置中选中的路径。
  3. 如果均未设置,则尝试从自动检测到的列表中寻找最合适的版本(如针对 MC 1.20 优先选择 Java 17+)。
  4. 如果均未设置且版本不匹配则在创建实例下载client时自动下载对应java并命中路径。

替代方案

No response

示例和参考

No response

优先级

高(显著改善体验)

贡献意愿

  • 我愿意实现这个功能
  • 我愿意帮助测试这个功能
  • 我可以提供设计草图或规范

其他信息

No response

Metadata

Metadata

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions