Repository navigation
变更说明
1.4.0
聚焦本地 Maven JAR 的 Java 源码读取,完善版本选择、磁盘缓存、错误处理和分段阅读体验。
JAR 定位与搜索
- 提供
search_group_id和read_jar_source两个 MCP Tool,分别用于查找 Maven 坐标和读取指定类的源码。 - SNAPSHOT 优先读取普通主包,使用最新时间戳主包名管理缓存,时间戳和构建号分别按时间与数字排序;普通主包不存在时回退到时间戳主包,只有普通包时使用普通包名作为缓存名。
- 普通 SNAPSHOT 主包优先使用普通 sources JAR,缺失时尝试所选时间戳构建的 sources;直接读取时间戳主包时匹配其 sources。支持只有 sources JAR 的依赖版本。
- 精确匹配 Maven 主包,校验坐标格式及仓库内路径,避免误选其他 classifier 的 JAR。
- 按 Maven 版本规则排列搜索结果,正确处理数字版本段、预发布限定词及版本别名。
group_prefix按完整 groupId 前缀分段匹配,优先扫描对应目录;每次搜索直接读取当前仓库,反映依赖的新增和删除。
源码读取与响应
- 优先读取 sources JAR;源码缺失或提取失败时,尝试反编译对应二进制包。
- 支持
Outer$Inner形式的内部类名,返回外部类源码时附带简短提示。 read_jar_source新增可选的start_line、end_line,行号从 1 开始且包含首尾;省略时保持全文返回。- 全文结果包含
class_name、artifact、source_type、code;指定行范围时附带总行数、实际返回范围和是否为片段的信息。 - 使用严格 UTF-8 解码,并对解码失败、类不存在、反编译失败等情况给出明确反馈。
- MCP 工具执行失败设置
isError=true,返回统一的错误码、说明和操作建议。
磁盘缓存
- 反编译结果保存在原始 JAR 所在版本目录的
easy-code-reader/下,普通版本缓存与 JAR 同名;SNAPSHOT 缓存优先采用最新时间戳包名。 - 通过实际读取的 JAR 的文件大小和修改时间校验缓存,输入更新后重新生成。
- 命中缓存时直接读取源码;需要反编译时直接读取原始 JAR,在独立临时目录中生成输出。
- 生成结果经过 ZIP 完整性及目标源码检查后原子写入,任务结束时清理临时目录。
- 每个 Maven 版本目录按默认 1 GiB 预算清理较久未使用的新格式缓存,保留当前发布的缓存文件。
- 已有缓存缺少输入校验信息时,在下一次读取对应 JAR 时重新生成。
反编译执行
- 使用异步 Java 子进程,支持请求取消、超时处理和子进程回收。
- 保留 CFR、Fernflower 的自动选择,并在运行环境兼容且预算允许时尝试备用反编译器。
- Fernflower 显式开启泛型签名恢复,修复 Java 21 及以上环境中泛型参数丢失的问题;已有旧格式缓存按需重建。
- 新增
--decompile-timeout,默认请求预算为 60 秒。 - MCP 调用等待源码准备完成后返回结果,失败或超时返回错误;Model 在同一次调用中获取源码。
配置与兼容
- Maven 仓库路径优先级为:
--maven-repo→MAVEN_REPO→ 用户settings.xml→ Maven 全局settings.xml→~/.m2/repository。 MAVEN_HOME、M2_HOME用于定位 Maven 安装目录及全局 settings;依赖原有隐式仓库路径的配置应改用--maven-repo或MAVEN_REPO。- 支持
~、相对路径及 settings 中的${user.home}、${env.NAME};配置按服务器实例隔离。 - 日志输出到 stderr。Python 安装目录无需写权限;生成反编译缓存需要对应 Maven 缓存目录可写。
- Python 最低版本为 3.10,MCP 依赖范围为
>=1.30,<2。
测试与发布
- 使用真实编译的 Java 字节码验证源码读取、内部类、缓存更新、并发写入、超时取消及 MCP 返回时机。
- 增加独立安装 wheel 后的 MCP stdio 冒烟验证,覆盖工具发现、坐标搜索、全文与分段读取、反编译、缓存及错误响应。
- 配置 Python 3.10/3.12、JDK 11/21 的 CI 测试矩阵,并包含 macOS、Windows 验证任务。
- 发布流程依赖验证工作流通过;完善构建产物内容检查、发布脚本和使用文档。