Skip to content

fix(java): stabilize Viva project tools and validate plugin workflows - #1884

Merged
1lck merged 7 commits into
previewfrom
codex/java-project-stability
Nov 13, 2026
Merged

1lck merged 7 commits into
previewfrom
codex/java-project-stability

Conversation

@1lck

@1lck 1lck commented Nov 13, 2026 •

Copy link
Copy Markdown
Owner

关联 Issue / Linked issue

PR 类型 / Type

  • fix:缺陷修复

改动说明 / What changes

背景 / Why

当前 Viva 的插件启动桥接遗漏了已选择的项目 JDK 与 Core 归一后的工具入口。普通 Java 8 源码可能被 JDT 按 Java 21 编译后无法运行;Gradle CLI 编译虽然成功,导入设置后端却没有真正启动。修复通用接线,并用真实插件、构建工具、语言服务器和调试器验证全链路,Java 专属规则继续留在插件。

改动 / Changes

  • 将清单声明且实际选中的工具 executable/home/version 传给后端语言服务器启动解析;复用现有工具选择,可选缺失正常继续、读取错误保留,不传环境或凭据,也不将项目脚本当作已安装工具。
  • Core 已把 runtime 归一为 tool 并展开绝对入口。原生宿主把入口转换回包内相对路径,继续逐段验证、拒绝越界与符号链接;工具入口的完整 argv 通过 Core 既有 InstantiateToolchainLaunch 与定义方模板实例化。
  • 新增 ToolEntryResolver 接线;复用原工具注册表序列化,保留裸工具、旧 runtime 与随包启动路径。宿主没有 Java 名称分支,没有新增公开插件 API。
  • Core pin 更新到已合入的 c0201c11e0c7c9ea304c42a346b86e6bb9f61358:通用冷启动默认握手期限 10→60 秒,显式期限优先,取消/失败仍回收。Core 用注入时钟验证 15 秒仍初始化、61 秒失败,不真实等待一分钟。
  • 补真实 Maven/Gradle、普通源码、外部 JAR、Ant 源码布局、Eclipse 多源码根、JSP/Tomcat/Servlet、旧源码级别与真实历史仓库回归;Java 8 同时断言 Maven/JDT 构建的 class major 52 和实际运行的 JVM。
  • Gradle 不止检查编译:核验实际源配置回读,断言 Core 中转没有 provider timeout;测试发现工具入口丢失并据此修复。
  • 断点断言局部变量、继续、第二次暂停停止、非法源码禁止运行旧 class;测试失败或暂停退出也无交互清理并确认 Core 会话已删除。
  • Windows 300 个小 JAR 覆盖长 classpath、末尾依赖、临时 classpath JAR 使用和退出删除。安装目录全文件 SHA-256 在两端实际流程后保持不变;哈希读取改用流式以控制测试自身内存。
  • 历史源码探针遵守 Apache 许可;测试动态定位被许可证工具移动后的断点。独立用例开始清理测试专用 Core 事件队列,防止前一个清理回归污染成功计数;所有等待与诊断导出有界。
  • 添加可选性能采样和六对 AB/BA 对照;更新两项功能矩阵与既有生命周期 Note,原生窗口验证仍 pending。

前置测试修复:PR #1886。首次远端 CI 的 Linux/Windows 都只失败在既有关闭标签测试(同 preview 基线文件);独立分支复现并修复遗漏的刷新,正式新回归在修复前为红、修复后为绿,不靠重跑或扩大超时。本分支包含同一修复;前置 PR 单独维护其红绿回归、矩阵和 Note,产品快捷键逻辑不变。

配套 PR:Core #29、Java #9、Gradle #10。Maven 使用现有 v0.0.1 prerelease,不需要新增后端改动。

不在本 PR 范围内 / Out of scope

没有发布 tag/Release/市场条目,也没有改 JDT 1.61 / Temurin 21 / Parallel GC 生产资源参数。不是任意 Java 项目支持完成的声明:JavaCC 生成源码模型 #1881、多版本 JAR #1882、jOOL 的 javac/ECJ 泛型差异 #1883 仍未完整跑通。Java 5/7 源码级别被当前 ECJ 安全拒绝;Ant 源码布局不代表执行 Ant target;JSP HTTP 与 Servlet 断点不代表 JSP 源码补全或 JSP 断点。长 module-path 见 Java 插件 #7。

类型专属:fix

复现与根因

  • 普通 Java 8 项目:原后端缺少所选工具事实,JDT 生成 major 65 而 Java 8 运行失败;修复后两次构建均 major 52,实际运行/暂停/继续/停止成功。
  • Gradle 导入设置:Core 归一后的 tool 入口被旧 Go Arguments 丢失,后端退出而 CLI 编译仍成功;严格回读配置和无中转超时断言修复前失败、修复后通过。
  • Windows 冷启动 JDT 实测握手约 15.4 秒,原 Core 10 秒默认失败;动作早期查询超时后也可能永久为空。Core [Windows][W1] 文档安全与多文件编辑状态 #29 修握手默认值;Java feat(git): complete conflict handling and shelve workflows #9 用 JDT 已有扩展进度合并恢复,不通过提高插件调用超时掩盖失败。
  • 引入接线缺口的迁移提交为 0faecba;Core 默认握手来自 8b453224;插件冷索引恢复根因与红绿记录见配套 PR。
  • 影响平台:两端共用 Go/Core/插件;Windows 路径/长 classpath 在目标系统验证。

检查项

范围检查 / Scope checks

功能矩阵 / Feature matrix

  • 更新 java-support-plugin 与 plugin-language-server-sessions:如实描述后端链路,两端原生窗口仍 pending
  • 矩阵验证及 origin/preview..HEAD 变更门禁通过
  • 没有提交 .artifacts 中生成的视图
  • [N/A] 未更新理由:已更新

统一日志系统 / Structured logging

界面文案 / i18n

  • [N/A] 新增文案:没有新增 UI 字符串;失败使用既有本地化边界
  • verify-app-language-localization 与 generate-i18n --check 通过,未放宽检查

逻辑归属 / Logic placement

  • Core 保持计划、校验和工具模板参数语义;Go 只进行原生路径、安装事实与进程接线,没有新增业务格式解析
  • [N/A] 平台已有可共享逻辑迁移:本次复用 Core 既有 API,不新增平台规则副本
  • Java 版本、JAR 启动语法、JDT 恢复、Gradle 属性优先级在各自插件/成熟上游

性能与内存 / Performance and memory

  • 按需启动;插件恢复仅事件触发,最多 128 活动任务/每周期三次,无新增轮询;工作区关闭释放
  • 新接线沿用后台启动与工具加载路径;不引入 UI 线程 I/O 或全量 IPC
  • 六对 AB/BA 的 12 次 Maven 全链路全部通过。JDT 就绪 RSS 793.25→793.79 MiB,动作可用 6.493→6.421 秒、热补全 11.76→11.87 ms,均无显著差异,不宣称优化
  • Gradle 配置后端仅加堆参数的六对对照:RSS 45.98→43.80 MiB(-4.72%,p=.002),初始化+八次查询 78.39→78.44 ms(p=.485)。仅为配置进程单点 RSS,不是整套 Java 内存或峰值上限

设置 / Settings

N/A:没有改设置 UI 或写回行为;配套 Gradle 修复真实 gradle.properties 读取,端到端严格回读验证。

插件契约 / Plugin contract

N/A:没有改协议/schema/fixture/SDK 或新增宿主方法通知;复用 Core 既有工具模板接口。Core pin 仅含通用握手默认期限与回归,其完整 SDK e2e CI 已通过。

发行包与资源 / Bundle and resources

  • 两端真实流程验证安装目录哈希不变;状态/索引/临时文件由既有可写 adapter 拥有,退出清理;runtime-bundle-immutability 门禁通过
  • [N/A] 资源复用清单:没有新增客户端资源目录、下载入口、缓存变量或身份校验路径;沿用既有 Core staging。外部 ZIP 仅用作测试输入,不纳入仓库

无用代码与重构 / Dead code and refactoring

验证 / Verification

命令或操作 平台 结果
desktop-go.sh test ./...(逐项计时) macOS 3435 条记录:3405 通过、30 跳过;最终生产代码
受影响五包 -race(逐项计时) macOS 965 条记录:941 通过、24 跳过
固定已合入 Core 后,默认 desktop-go.sh test ./... macOS 通过,不依赖本地 Core override
go vet ./... macOS 通过
前置关闭标签测试修复分支完整逐项计时 + 关闭测试 race macOS 3426 条:3400 通过、26 跳过;新增用户绑定 80 ms;合并后用固定 Core 重验关闭标签与工具入口
工具入口/原生路径/真实 Core 三项回归 macOS / Windows 通过,非 Java fixture 验证模板语义
真实 ZIP:Maven、Gradle、普通源码/外部 JAR/Ant/Eclipse macOS / Windows 补全、构建、运行、断点变量、继续/停止、编译失败拒绝旧 class、安装目录只读通过;Gradle 实际配置回读且无中转超时
JSP/Tomcat9/Servlet、暂停后失败清理、Windows 300 JAR 长 classpath 对应两端 / Windows 通过;不扩展为 JSP 源码或 Ant target 支持
历史 Commons Text 1.9 原 POM/API 探针 macOS 全链路通过;Lanterna/JSQLParser/jOOL 的未通过部分见关联 Issue
Core 注释/文档/完整 crate/engine 逐项计时 macOS 通过,engine 126 项;Core #29 五项远端 CI 通过
Java Rust fmt/clippy/SDK锁/完整计时 macOS / Windows Mac 378 项通过,Windows 完整测试与 release 后端构建通过
Gradle 真实 Java8 SDK/锁/CLI/actionlint macOS / Windows 协议及异常清理两端通过;CLI Mac Gradle7.6.4/Java17 通过
矩阵/Note/i18n/bundle/实际提交差异测试静态门禁 macOS 通过,无豁免扩大

未能执行的检查和原因: 原生 Viva 窗口、正式安装/签名/更新、任意框架与全部日志路径没有完整验收。Windows 为 ARM VM 中 x64 工具,功能可验证,耗时不能代表原生 AMD64 性能。默认全工作区测试静态门禁会扫描用户已有未跟踪 extension-host/node_modules;没有删除或豁免该目录,PR 提交差异门禁通过。旧日志/边界检查已移除的部分保持未完成,不将组件测试当整机 UI 验收。

提交前确认 / Final checks

  • 从 preview 开始,开发中合并最新 preview;目标 preview
  • 默认 Draft 创建,本地验证完成后才 ready
  • 明确暂存本次文件;不提交用户已有 extension-host、构建产物、个人路径或凭据
  • 本次应用/JVM/测试进程均已清理,Windows VM 已关闭

@1lck
1lck marked this pull request as ready for review November 13, 2026 22:42
@ghfind-review ghfind-review Bot added the review: high ghfind author score; see https://ghfind.com label Nov 13, 2026
@lithe-code-review

lithe-code-review Bot commented Nov 13, 2026 •

Copy link
Copy Markdown

Lithe Review

结论: ⚠️ 有建议
范围: preview ← codex/java-project-stability · head: 0805744

未发现需要阻塞合并的问题。发现一项 P2 工具启动边界遗漏。

Findings

  1. [P2 / 本次引入] 随包工具入口需要解析完整的固定安装信息
    desktop/internal/workbench/runs.go:98

    • 实际影响:input.Executable 非空时跳过工具解析,selection 只有可执行路径,导致工具定义声明的环境变量和 PATH 项丢失,传给模板的 home 也为空。该分支同时跳过 MinimumVersion 校验;后面的 InstantiateToolchainLaunch 不接收版本要求,无法补做检查。
    • 触发条件:工具计划同时包含 Entry 和 PackagedRuntime。Runner.Start 会把已验证的随包运行时作为 input.Executable 传入,进入这个新增分支。
    • 复现输入与调用路径:使用 desktop/internal/toolchain/testdata/runtime.plugin.json 中声明 FICTIONAL_VM_HOME 和 pathPrepend 的工具定义,为其配置随包运行时和入口,经 Runner.Start → resolveBackendToolEntry 启动;返回环境不包含这些声明。设置高于运行时实际版本的 MinimumVersion,也不会进入版本探测。这是本次新增工具入口接线遗漏的分支。
    • 修复方向:参照 desktop/internal/workbench/debug_launch.go:70,对随包可执行文件调用 toolchain.Resolve,通过 Fixed{Executable: input.Executable} 固定安装,并传入最低版本要求,再使用返回的完整 selection 实例化模板和环境。

Scope Check

架构归属对账

逻辑块 归属 依据
pluginhost/launch.go:VerifyLaunch、plannedPackagePath 平台路径适配 使用 filepath.Rel,继续经 os.Lstat 逐段检查文件及符号链接
pluginbackend/pluginbackend.go:Runner.Start 原生启动桥接 组合已验证路径与 PluginBackendStart,不解释工具入口语法
pluginservice/backendlaunch.go:languageLaunchParams、workbench/runs.go:resolveLanguageTool 原生安装事实桥接 复用现有文件系统发现与 Core selection,只传 executable/home/version
workbench/runs.go:resolveBackendToolEntry 平台适配,模板规则复用 Core 命令 toolchains.instantiateLaunch;fixture 为 Core 仓库的 shared/plugins/contract/v1/fixtures/run/tool-reference-launch.plugin.json;随包安装解析遗漏见 Finding 1
toolchain/load.go:RegistryInput 边界序列化 原 rawRegistry 的导出复用,数据形状未改变
  • 未沉入清单:修改逻辑范围内未发现新增待迁入 Core 的存量项。

Checked and cleared

  • 工具绝对入口转换为包内相对路径后,仍执行既有越界、普通文件和符号链接检查。
  • 语言服务器工具事实不携带 environment,排除了 ProjectCode;实际解析错误继续返回启动失败边界。
  • 非 Java 工具 fixture 覆盖了入口模板与中文空格路径,未新增 Java 名称分支。
  • 新增集成测试使用显式外部输入,复用有截止时间的等待与失败清理;包哈希读取改为流式处理。
  • 两端共用本次 Go 接线;功能矩阵仍保持 partial/pending,没有把无头测试等同于原生窗口验收。
  • 本次没有新增界面、布局或可见文案,截图要求不适用。

Suggestions

  1. 修复 Finding 1,并增加经过生产 resolveBackendToolEntry 的随包运行时回归:分别验证环境/PATH 导出、home 传递和最低版本不满足时拒绝启动。现有新增测试注入了替代 resolver,未覆盖该生产分支。

Observations

  • desktop/internal/pluginbackend/pluginbackend.go:Runner.Stop 仍通过重复销毁请求探测终态;属于既有问题,已由 #1860 跟踪,本 PR 无需夹带修复。
  • 日志类型生成与使用门禁恢复已由 #1802 跟踪;正文如实标记未完成,不能计为检查通过。

Summary

主要接线方向符合现有架构,回归覆盖明显增加。建议补齐随包工具的固定安装解析,避免同一种工具在后端启动与调试适配器启动时获得不同的安装事实。

Verification

  • 静态检查了完整清单中的 22 个文件及指定 base...head 差异,并追踪工具选择、模板实例化、后端启动、语言服务器启动和测试清理调用链。
  • 已提供结果:作者报告 macOS 全量测试、受影响包竞态测试及两端真实 Java 工作流通过;这些结果未由本次审查重跑。
  • head 检查状态:Agent Notes 成功;其余提供的检查仍有运行中、取消或跳过,尚无完整最终 CI 通过结果。
  • 本次未运行仓库代码、测试或验证脚本,未访问网络、修改文件或发布评论。
  • 验证限制:配套 Core/Java/Gradle PR 的内部实现未独立审查;原生 Viva 窗口、正式安装/签名/更新及完整日志路径仍待验收。

@lithe-code-review

Copy link
Copy Markdown

Lithe 运行验收

版本:c0ca5a1d548ebd3e47aaff6554f2eedf9d8c8eb9;状态:blocked。
本报告独立于代码审查;只报告实际执行的场景,不代表所有问题均已修复。

执行未完成:Invalid scenario identity

本次未形成完整验收结果,详见执行原因。
详细步骤和原始证据保存在服务器受限目录(14 天、总计不超过 1 GiB);当前没有公开下载链接。

@1lck
1lck merged commit 607f009 into preview Nov 13, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

review: high ghfind author score; see https://ghfind.com

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant