Repository navigation
feat(backend): Maven 模型和依赖改由常驻 Java 后端提供并持久快照(1lck/Lithe-IDEA#1351) - #3
Merged
Merged
Conversation
- 新增 backend/:Java 8 构建后端,基于 Lithe Java 插件 SDK,shade 进
lib/lithe-maven-backend.jar。一次 Maven 运行同时导出模型和全部模块依赖,
结果按输入指纹存入 maven-snapshot.json(StateStore 原子写);指纹不变时
重启后也不再运行 Maven,refresh 绕过快照;并发请求共用一次运行,全部取消
才结束 Maven;运行期间输入变化则不写快照。
- plugin.json:model / dependencies 改为 source: provider,provider 以
runtime java 8 启动后端并传 --state ${workspaceStateDir},补
languageServer.launch 权限;任务、测试、诊断不变。
- sdk.lock.json + package.mjs:按锁文件下载并校验 SDK;SDK 发布前用
LITHE_SDK_JAR 指向本地构建,发布流程拒绝未锁定的 SDK。
- 测试:test-backend.mjs 用假 Maven 计数覆盖快照命中/失效/刷新/合并/取消;
test.mjs 经后端用真实 Maven 读取;CI 在 Java 8 和 17 上跑后端测试。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
背景
1lck/Lithe-IDEA#1351:Maven 面板每次打开项目、每展开一个模块都要重新转圈。原因是
model/dependencies声明为source: "command",每次加载、每个模块都单独起一次mvn … pre-clean,宿主不持久化结果(单依赖模块也要约 3 秒)。本 PR 把读取项目改成常驻 Java 构建后端 + 持久快照:指纹不变时重启 Lithe 也不再运行 Maven。
依赖
sdk.lock.json的sha256暂为null,CI 从 #1379 的分支feat/1351-java-sdk构建 SDK。#1379 合并并打sdk-java-v0.1.0后,需要在本 PR 填入正式 Release 的 URL 和 SHA-256,并删除 CI 里的 “Build the unreleased plugin SDK” 一步,之后才能合并/发布(package.mjs --expect-tag会拒绝没有锁定 SDK 的发布)。refresh: true(Reload / 同步文件变化时)和tool: { executable }(宿主按invocation解析出的 mvn)。MAVEN_HOME→PATH查找 Maven;但用户在设置里覆盖的 Maven 不会生效,Reload 也不会绕过快照(POM/配置变化仍会通过指纹失效)。改动
backend/(新增,Java 8)Backend/Processes/StateStore,shade 成lib/lithe-maven-backend.jar。SDK 未发布到 Maven 仓库,构建时用 system scope 编译,再用 shade 的extraJars合并进去,不往~/.m2安装任何东西。-Dlithe.modelOutput和-Dlithe.dependenciesOutput,不传dependenciesProject,一次拿到模型和每个模块的依赖树。项目依赖按project.path→ 模型里的模块坐标 → 工作区依赖树节点取子树,扩展本身不改。tool.executable优先,缺失时回退 mvnw /MAVEN_HOME/PATH;optionArguments原样传给 Maven;environment叠加在后端环境上;没有JAVA_HOME时设为启动后端的 Java。maven-snapshot.json(snapshotVersion: 1,StateStore 原子写,按根目录分条,最多 32 个根)。损坏、版本未知或缺字段都按未命中处理。pom.xml的内容哈希。有界遍历:深度 24、5 万项,跳过target/、.git/、node_modules/;.mvn/maven.config、extensions.xml、jvm.config、wrapper/maven-wrapper.properties;settings.xml/toolchains.xml,Maven 安装目录的conf/settings.xml,以及选项或maven.config里-s/-gs/-t/-gt指定的文件;JAVA_HOME/MAVEN_OPTS等变量、mvn 路径与修改时间、java.version、扩展 JAR 哈希、后端版本。refresh→ 直接返回;maven.loadFailed,附上[ERROR]行,旧快照保留。plugin.jsonmodel/dependencies改为source: "provider"。provider:launch { kind: runtime, tool: java, minimumVersion: "8", entry: lib/lithe-maven-backend.jar },arguments: ["--state", "${workspaceStateDir}"],保留executesProjectCode/mayUseNetwork: true。requires加buildProviders: 1、serverProcess: 1,权限加languageServer.launch,写法与 SDK 示例sample-build一致。任务、测试、诊断、同步、选项都不变。打包与脚本
sdk.lock.json:记录 SDK 版本、下载 URL 和 SHA-256,以及发布前用来构建的源码分支。scripts/package.mjs:plugin.json、extension/pom.xml、backend/pom.xml);.cache/sdk/并校验 SHA-256;LITHE_SDK_JAR可指向本地 JAR,锁文件有哈希时也必须一致;--expect-tag拒绝本地 JAR 和未锁定的 SDK;lib/lithe-maven-backend.jar。scripts/backend-client.mjs(新增):按宿主方式(LSP 分帧、initialize协商litheBuild1)驱动后端。所有等待都有上限;后端退出或发出坏帧时,立即让等待中的请求失败。测试
scripts/test-backend.mjs(新增,不需要 Maven):用test/fixtures/fake-maven-backend.mjs记录每次运行,覆盖:.mvn/maven.config后失效;refresh绕过快照;tool.executable时回退到项目的 mvnw;scripts/test.mjs:模型和依赖改为经后端用真实 Maven 读取,断言不变,另外检查快照已写入;LITHE_CAPTURE_DIR照常输出这三份文档。scripts/test-process.mjs:原来的 “fake-maven 输出缺失/损坏” 回归改为 “provider 起不来/回坏帧” 时 lane 失败、报告齐全、scratch 已清理;Maven 输出缺失/损坏的场景移到test-backend.mjs(maven.invalidOutput)。test/fixtures/fake-maven.mjs改为fake-java.mjs。setup-java同时装 8 和 17。CI 在 17 和 8 上各跑一次test-backend.mjs,Maven 3.6.3 那一路的test.mjs用 Java 8 运行后端;Release 在 Java 8 上跑后端测试。verify-scripts.mjs的源码副本加入backend/和sdk.lock.json。验证
本地(macOS,Maven 3.10,SDK 由 #1379 分支
b7b8be1构建,SHA-25653af40a3…cb0b04a):LITHE_SDK_JAR=… node scripts/package.mjs✓node scripts/test-backend.mjs:Java 17、Java 21 均 15/15 ✓。本机没有 JDK 8,Java 8 由 CI 验证。node scripts/test.mjs(真实 Maven)16/16 ✓node scripts/test-process.mjs8/8 ✓尚未做: