Skip to content

feat: 从 Lithe 主仓库拆出 Java Support 插件(初始移植) - #1

Merged
xiaoyumuxi merged 9 commits into
mainfrom
feat/initial-port
Nov 5, 2026
Merged

xiaoyumuxi merged 9 commits into
mainfrom
feat/initial-port

Conversation

@xiaoyumuxi

@xiaoyumuxi xiaoyumuxi commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

从 Lithe 主仓库(1lck/Lithe-IDEA)拆出 Java Support 插件的第一版代码,作为这个仓库的起点。目标是让主仓库的 Rust Core 和 macOS 宿主里不再有 Java 专属逻辑,这些逻辑改由本插件通过通用插件 API 提供。

这个 PR 还没有接入宿主:plugin.json 没有声明 backend,用到的通用 API 还在主仓库的 PR 里评审(见下文“依赖的宿主 PR”)。合入本 PR 不会改变任何 Lithe 版本的行为。

内容

按提交顺序:

  1. 插件包与打包脚本(dev.lithe.plugin.java-support/、scripts/、third_party/)
    • 从主仓库 Plugins/mac/Official/JavaSupport 搬来的清单、图标、项目模板和设置。id 为 dev.lithe.plugin.java-support,version 为 1.1.0,pluginAPIVersion 为 4。
    • 打包脚本:prepare-jdtls.sh、prepare-jdk.sh 在构建阶段固定 JDT LS、Lombok、java-debug、vscode-java-test 运行器和 JDK 的来源,并校验哈希;assemble-package.sh、build-package.sh、archive-package.sh、verify-package.sh 负责组装、归档和校验。
    • 运行时只写宿主分配的状态目录,不写插件包,保证代码签名和 Sparkle 增量更新的基线不变。
  2. crates/java-domain:从 Core 移过来的 Java 领域规则,宿主里不再需要它们。包括:
    • 语言与 LSP:JDT 集成、Maven settings 交给 JDT 的方式。
    • 执行:Java 运行入口识别、启动参数。
    • 调试:步进过滤、热代码替换的请求形状。
    • 测试:测试发现与结果解析(按用户的分工,测试由后端负责,不走 LSP 契约)。
    • 附带 fixtures/ 下的 LSP、Java、调试、Spring、MyBatis 样例。
  3. 插件后端(backend/)
    • 基于 Rust 插件 SDK lithe_plugin_sdk 0.1.0(标签 sdk-rust-v0.1.0)。sdk.lock.json 固定提交,scripts/verify-sdk-lock.sh 检查 Cargo.lock 解析到的提交,--download 还会核对已发布 crate 的 sha256。
    • plugin_functions.rs:通过 Core 中转调用其他插件函数(API-35,插件 → Core → 插件),例如向 Maven/Gradle 插件取 JDT 需要的工程配置。中转协议按主仓库 #1742 的设计编写,目前是暂定的。
    • 三个会话命令目前只回答 NotSupported,等宿主 API 合入后再实现。
  4. CI 与发布(.github/workflows/)
    • ci.yml:
      • rust(ubuntu):cargo fmt --check、clippy -D warnings、cargo test --workspace --locked、SDK 锁校验。
      • package(macos-26):构建未签名的开发归档。Draft PR 不跑这一项,避免占用 macOS runner。
    • release.yml:推 v* 标签时触发,先测试再发布。只有最后的签名步骤会读取 LITHE_PLUGIN_PACKAGE_PRIVATE_KEY,发布标记为预发布。签名和校验工具从主仓库固定提交构建,提交号记录在 host-tools.lock.json。
  5. 文档:README.md 和 MIGRATION.md。
    • MIGRATION.md 写明每块逻辑从主仓库哪个文件搬来,用固定提交 dbe8441e2 的永久链接,并列出每块要靠哪个通用 API 接回宿主。
    • 第 10 节列出未完成事项。

依赖的宿主 PR

本插件要等这些 PR 合入,才能声明 backend 并接上宿主:

API 主仓库 PR
API-25 语言服务器会话、由后端决定启动方式(含 API-12、20、22) #1745(Draft)
API-25、27 编辑器 Provider 与编辑器动作(运行标记) #1730
API-22、23、30 后端发起运行与调试、调试适配器行为、输出链接 #1746(Draft)
API-33 项目生成器的通用工具字段 #1740
API-35 跨插件函数中转 #1742
宿主语言专属内容的检查闸门 #1727(已合入)

Maven settings 和工程导入归 Maven/Gradle 插件(lithe-plugin-maven、lithe-plugin-gradle),本插件只经中转取用。Spring Boot 和 MyBatis 的支持留在本插件里,不再拆分。

未完成事项

详见 MIGRATION.md 第 10 节,主要有:

  • 宿主接线(上表),以及接线后删除主仓库里的 Java 代码。
  • 中转协议定稿后,复核 plugin_functions.rs 及其测试。
  • 没有用真实 JDT 跑过端到端测试,没有在 Linux 上实跑插件,也没有做过真实签名和完整的 CI 发布。
  • Windows 插件包没有做。
  • 没有登记到 Lithe Store。要等稳定版 Lithe 支持 pluginAPIVersion 4,并且主仓库不再内置 Java Support(目前 official-plugins.json 里是 bundledUntilPublishedVersion: "1.1.0")。

验证

在 macOS(Apple Silicon)本地运行,工具链用 Rust 1.99.0,与 CI 的 dtolnay/rust-toolchain@stable 一致。结果如下:

  • cargo fmt --all --check:通过。
  • cargo clippy --workspace --all-targets --locked -- -D warnings:通过。
  • cargo test --workspace --locked:295 个测试全部通过,其中包括中转相关的 24 个测试。
  • scripts/verify-sdk-lock.sh --download:通过。
  • 第一次 CI 在 clippy 1.99 的 needless_borrows_for_generic_args 上失败,原因是本机较旧的 clippy 没有这条检查;已修复(jdt.rs 中把 fn 指针按值传入),并用 1.99.0 在本地重跑了上面所有检查。
  • 本次没有启动 Lithe,也没有在宿主里加载这个插件。

从 Lithe 主仓库 1daaeb525 移入插件包的静态部分和构建脚本:

- dev.lithe.plugin.java-support:plugin.json(身份、权限、设置、语言服务器、
  三个项目生成器不变)、图标和项目模板。清单暂不声明 backend,等宿主插件
  接口就位后再加。
- scripts/assemble-package.sh、build-package.sh、verify-package.sh、
  archive-package.sh:组装、校验、归档签名包。运行时包只读,JDT LS、Lombok、
  java-debug、测试运行器和 JDK 都在构建阶段固定来源后放进包。
- scripts/prepare-jdtls.sh、prepare-jdk.sh 和 third_party 清单:来源地址与
  SHA-256 固定在清单里。
- scripts/host-tools.sh 与 host-tools.lock.json:签名器和校验器按固定的 Lithe
  提交构建。
把 Core 和 macOS 层里的 Java 规则移成不依赖宿主的 Rust crate:入口与 main
方法识别、运行标记、JDT LS 设置与启动、工作区策略与缓存保留、构建就绪判断、
项目准备、Spring 与 MyBatis 索引、JDK 选择、启动命令与 argfile、Java 测试
发现与调试启动、测试结果通道状态机。命令名、载荷、响应和错误码与 Core 一致。

Maven 和 Gradle 的导入逻辑不在这里。JDT LS 的导入设置由 Maven/Gradle 插件
提供,Java 只声明接受的键(CONTRIBUTED_SETTINGS_KEYS)并校验收到的片段。
jdt_contributions 定义跨插件接口 languageImport.settings 与
languageImport.settingsChanged:按提供方分槽的合并、状态和失败记录。

宿主差异(存储、日志、Git、语言服务器通道)保留为带计划编号的
TODO(host-api: API-NN) 占位。fixtures 是与主仓库共享的契约样例。

本提交与下一个提交(后端)合在一起才是完整的 Cargo 工作区。
backend 是基于已发布 Rust 插件 SDK(lithe_plugin_sdk 0.1.0,标签
sdk-rust-v0.1.0)的插件后端进程:把每条领域命令注册为同名插件函数,宿主
取消转发到领域层的协作取消,错误映射到稳定的 java.* pluginErrorCode。

plugin_functions 是后端唯一知道跨插件函数中转协议的模块:启动 JDT LS 前
发现并调用所有 languageImport.settings 提供方,单个提供方失败或超时不影响
其他提供方,答案只接受 JDT LS 导入设置命名空间内的键。中转协议形状是暂定的,
改名只动这个文件。languageImport.settingsChanged 的注册等 SDK 或中转暴露
调用方插件 ID。

sdk.lock.json 记录 SDK 的标签、提交和 crate 归档 SHA-256,
scripts/verify-sdk-lock.sh 与 backend/tests/repository_pins.rs 检查
Cargo.lock 解析到同一个提交。
ci.yml:Ubuntu 上检查格式、clippy、测试和 SDK 锁;macOS 上构建并校验未签名
开发包。release.yml:推送 v<版本> 标签后先跑 Rust 检查,再构建两个架构的包,
只有最后的签名与发布步骤拿 LITHE_PLUGIN_PACKAGE_PRIVATE_KEY。发布保持为
预发布,直到 Lithe 稳定版不再内置 Java Support。
README 说明功能、工作方式、开发命令和发布流程。MIGRATION.md 是移植账本:
主仓库路径(路径@1daaeb525)到本仓库的映射表(每行一个状态)、交给 Maven/
Gradle 插件的内容、跨插件函数设计(API-35)、按计划编号分类的
TODO(host-api) 清单、判断记录、主仓库分阶段删除清单、发布与签名、未完成事项。
MIGRATION.md 第 4.2 节原来指向本机临时目录,公开后无法访问。改为主仓库
preview 提交 dbe8441e2 上的原文件链接。第 6 节加上各计划编号对应的宿主
PR,中转相关的描述链接到 #1742。
@xiaoyumuxi
xiaoyumuxi marked this pull request as ready for review November 5, 2026 01:13
@xiaoyumuxi
xiaoyumuxi merged commit 10d652d into main Nov 5, 2026
3 of 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