Skip to content

[1.5.2 Patch] Java/JDK 候选管理与环境医生联动,支持外部 JDK 设为 JAVA_HOME 但禁止卸载 #61

Description

@weidonglang

用户反馈现象

用户反馈:

  • 环境医生能发现当前 Java 版本,但感觉不能直接管理。
  • JDK 管理中发现 JAVA_HOME 与用户 PATH 首个 java.exe 不一致。
  • 用户认为 Java 不一致时可以统一到本机某个版本。
  • 对非受管 JDK,用户认为虽然不能卸载,但也应该能作为候选被验证和用于环境配置。

问题判断

1.5.1 已经具备环境可靠性中心和 Java 稳定修复计划,但用户反馈说明:

  • 环境医生、版本管理、环境页之间的入口联动可能仍不够直观。
  • JDK 候选项需要更清晰地区分受管、外部、IDE 内置、第三方管理器来源。
  • 外部 JDK 应允许“设为 JAVA_HOME / 生成稳定修复计划 / 验证 Maven/Gradle/Nacos/Nexus”,但绝不允许卸载或删除。

影响范围

该问题可能影响:

  • 环境医生 Java 检查项。
  • 版本管理 JDK 页面。
  • 环境可靠性中心。
  • Maven/Gradle Java 使用检查。
  • Nacos/Nexus Java 消费者验证。
  • 项目启动向导中的 IDEA JDK 匹配建议。

修复目标

统一 Java/JDK 候选管理模型:

受管 JDK:可切换、可验证、可卸载。
外部 JDK:可验证、可设为 JAVA_HOME、可生成修复计划、不可卸载。
IDE 内置 JDK:只提示、可作为证据、默认不接管、不卸载。
第三方管理器 JDK:只提示来源,可验证,可建议用户回到对应工具管理。

具体要求

1. JDK 候选项分类

增加或统一字段:

JdkCandidate {
    path: String,
    version: String,
    sourceKind: String, // managed / external / ide_bundled / scoop / choco / unknown
    javaExists: bool,
    javacExists: bool,
    canUseAsJavaHome: bool,
    canUninstall: bool,
    warning: String,
}

2. 外部 JDK 操作

外部 JDK 允许:

  • 检查完整性。
  • 复制路径。
  • 打开目录。
  • 生成 Java 稳定修复计划。
  • 设为用户级 JAVA_HOME,但必须有 diff、备份、确认、验证。
  • 验证 Maven、Gradle、Nacos、Nexus 能否读取。

外部 JDK 禁止:

  • 删除目录。
  • 移入回收站。
  • 当成 DevEnv Manager 受管版本卸载。
  • 自动接管第三方管理器目录。

3. 环境医生联动

当环境医生发现 Java 问题时,检查项右侧应提供明确行动入口:

查看 JDK 候选
检查当前 JDK
生成 Java 稳定修复计划
查看 PATH 命中详情
验证 Maven/Gradle Java
验证 Nacos/Nexus Java

不要只告诉用户“发现冲突”,还要告诉下一步点哪里。

4. UI 文案

示例:

这是外部安装的 JDK。DevEnv Manager 可以使用它作为 JAVA_HOME,并验证 Maven/Gradle/Nacos/Nexus 是否能读取,但不会卸载或删除该目录。

如果 JAVA_HOME 与 PATH 首个 Java 不一致:

当前 JAVA_HOME 指向 JDK 21,但 PATH 首个 java.exe 来自 JDK 17。建议选择一个 JDK 作为统一生效版本,并生成 Java 稳定修复计划。

测试要求

新增测试或 mock:

  • 外部 JDK 可生成 Java 稳定修复计划。
  • 外部 JDK 不显示卸载按钮。
  • IDE 内置 JDK 不显示卸载按钮。
  • 受管 JDK 显示卸载受管版本。
  • JAVA_HOME 与 PATH 首个 Java 不一致时给出行动建议。
  • 缺少 javac.exe 的 JDK 不能设为完整 JDK。

验收标准

  • 环境医生 Java 问题可以跳转到对应管理/修复入口。
  • 外部 JDK 能被验证并设为 JAVA_HOME 候选。
  • 外部 JDK 不能被删除或卸载。
  • JDK 候选来源和可操作范围清晰显示。
  • cargo test --all-targets 通过。
  • npm run build 通过。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions