Skip to content

feat(backend): 语言服务器由后端启动,运行/调试/测试经宿主通用 API 接管 - #6

Merged
xiaoyumuxi merged 2 commits into
mainfrom
feat/backend-launch
Nov 7, 2026
Merged

xiaoyumuxi merged 2 commits into
mainfrom
feat/backend-launch

Conversation

@xiaoyumuxi

@xiaoyumuxi xiaoyumuxi commented Nov 7, 2026 •

Copy link
Copy Markdown
Contributor

做了什么

Java 拆分(主仓库 1lck/Lithe-IDEA#1495)的插件侧:宿主不再内置任何 Java/JDT 知识,本插件的后端接手语言服务器启动、运行、调试和测试,全部走宿主通用插件 API。配套的宿主改动见 1lck/Lithe-IDEA#1791(Draft)。

语言服务器由后端启动(serverProcess: 4)

  • plugin.json 的语言服务器 launch 改为 {kind: "backend", function: "java.resolveLaunch", timeoutMilliseconds: 60000},去掉 hostIntegration: jdt 与宿主侧 JDT 资源映射。
  • backend/src/launch.rs:按包内布局解析 JDT LS、Lombok agent、java-debug、java-test 扩展与运行器、打包 JDK,产出完整命令行;宿主只负责起进程。
  • java.resolveLaunch 读取请求里的 tools.java(宿主按清单 requiresTools: ["java"] 解析到的 JDK),写进 java.configuration.runtimes 作为默认 JDK,编译目标与 Run 使用的 JDK 一致,修掉拆分过程中出现的 UnsupportedClassVersionError。
  • 启动前在工作区有界扫描 .java 写入 triggerFiles,没有构建文件的工程也能被 JDT LS 正确布局;宿主没答 workspace/getFolders 时记 launch.workspace_folders_unavailable 降级诊断。
  • 去掉 -Declipse.log.level=WARNING:JDT LS 1.61 在客户端连接时读首条平台日志的日期,过滤 INFO 会让它在 initialize 前因 NPE 退出。

运行 / 调试 / 测试由后端经通用 API 接管

  • backend/src/run.rs:用 editor/registerActions 为 .java 文件提供行内 Run/Debug 动作(main 方法、JUnit/TestNG 测试类与方法);收到 language/status ServiceReady 后重新注册,打开的文档立刻显示运行标记。
  • 点击动作:经 JDT LS vscode.java.buildWorkspace / resolveClasspath / resolveMainMethod 等命令构建并解析类路径,或规划测试启动,再用 lithe/host/run/start 以 java 工具定义启动;调试时附 jdwp 代理,宿主接到 java 调试适配器(lithe/host/debug/start)。
  • 宿主工具栏与菜单的 Run/Debug 会映射到这些编辑器动作(宿主侧改动),本插件无需单独处理。
  • 测试结果:后端监听回环端口接收 Eclipse JUnit 运行器输出,结束后用窗口消息显示计数,run/didExit 后停止。
  • outputLinkMatchers: 1:堆栈行 at pkg.Class.method(Class.java:12) 经 java.resolveOutputLink 用 workspace/findFiles 解析成工作区文件链接。
  • debugAdapters: 3:声明热替换(redefineClasses / hotcodereplace)与默认步进过滤 $JDK、$Libraries,宿主不再内置 Java 的步进策略。

清单其他改动

  • 新增权限:documents.contentProvider、documents.read、editor.actions 等;requestMethods 加 java/classFileContents;commands 白名单加 vscode.java.*;forwardNotifications 转发 language/eventNotification|progressReport|status;语言服务器 state 改为 workspace 作用域并限制保留数量;remote: "unsupported"。
  • assemble-package.sh / verify-package.sh:不再由宿主提供运行时参数,校验后端可执行与包内 JDT 资源布局。

文档

  • MIGRATION.md 第 5.8/5.9、6、10 节与 README 同步到当前实现,补充宿主工具栏 Run/Debug 对编辑器动作的映射。

合入顺序

依赖宿主侧拆分 PR 中的 serverProcess 隐式工具引用、debugAdapters: 3、outputLinkMatchers 与编辑器动作映射;宿主先合,本 PR 随后发预发布版本验证。

已知限制(后续)

验证

  • cargo fmt --check:通过。
  • cargo clippy --workspace --all-targets -- -D warnings:通过。
  • cargo test --workspace:369 个测试通过(领域 282、后端单元 77、repository_pins 7、session 3)。
  • 真实宿主(macOS,拆分分支的 debug 构建)端到端:打开 Java 工程后状态栏 LSP 变绿;工具栏 Run 输出程序结果;Debug 在断点停住并显示线程与变量;Stop 正常;运行面板重跑正常。

- `java.resolveLaunch`:语言服务器改为 `launch.kind: "backend"`,后端按包内布局解析 JDT LS、Lombok、java-debug、测试运行器与 JDK,去掉 `hostIntegration: jdt`
- `backend/src/run.rs`:用 `editor/registerActions` 提供 `.java` 文件的行内 Run/Debug 动作;点击经 JDT LS 构建并解析类路径(main)或规划测试启动(JUnit/TestNG),再用 `run/start` 以清单 `requiresTools: ["java"]` 引用的 JDK 工具定义启动;调试时附 jdwp 代理并由宿主接到 `java` 调试适配器
- 测试结果:后端在回环端口监听 Eclipse JUnit 运行器,结束后用窗口消息显示计数,`run/didExit` 后停止
- `outputLinkMatchers`:堆栈行 `at pkg.Class.method(Class.java:12)` 经 `java.resolveOutputLink` 用 `workspace/findFiles` 解析为工作区文件
- 清单:`serverProcess: 4` + `requiresTools`、`debugAdapters: 3`(热替换 `redefineClasses` 与默认步进过滤 `$JDK`/`$Libraries`)、`outputLinkMatchers: 1`、新增权限与 `vscode.java.*` 命令白名单
- 文档:MIGRATION.md 第 5.8/5.9 节、第 6/10 节与 README 同步
…的日志级别

- `java.resolveLaunch` 读取请求的 `tools.java`,写进 `java.configuration.runtimes` 作为默认 JDK,
  运行时编译目标与 Run 使用的 JDK 一致,不再出现 UnsupportedClassVersionError
- 启动前在工作区文件夹里有界扫描 `.java` 文件写入 `triggerFiles`,无构建文件的工程也能被 JDT LS 正确布局;
  宿主没答 `workspace/getFolders` 时记 `launch.workspace_folders_unavailable` 降级诊断
- 去掉 `-Declipse.log.level=WARNING`:JDT LS 1.61 在客户端连接时读首条平台日志的日期,过滤掉 INFO 会让它
  在回答 initialize 前因 NullPointerException 退出
- 后端收到 `language/status` ServiceReady 后重新注册编辑器动作绑定,打开的文档立刻显示运行标记
- MIGRATION.md 补充上述行为与宿主工具栏 Run/Debug 对编辑器动作的映射
@xiaoyumuxi
xiaoyumuxi marked this pull request as ready for review November 7, 2026 09:39
@xiaoyumuxi
xiaoyumuxi merged commit 28628cb into main Nov 7, 2026
4 checks passed
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

Successfully merging this pull request may close these issues.

1 participant