Open
Conversation
新增两个工作流: 1. build.yml - 自动构建 - 推送到 main/master 分支时自动触发 - PR 到 main/master 分支时自动触发 - 构建完成后上传 artifact 保留 7 天 2. manual-release.yml - 手动发布 - 手动触发,可输入版本号 - 可选择是否为预发布版本或草稿 - 自动创建 Git tag 并发布 Release - 自动生成 changelog
新增客户端自身更新机制,支持自动检查、下载和安装新版本: 新增文件: - selfupdate/SelfUpdateChecker.java - 版本检查器 - selfupdate/SelfUpdateDownloader.java - 下载器 - selfupdate/SelfUpdateInstaller.java - 安装器 - selfupdate/SelfUpdateManager.java - 统一管理器 - selfupdate/ClientVersionInfo.java - 版本信息模型 - docs/self-update-design.md - 设计文档 - docs/client-version.json - 服务端版本文件示例 修改文件: - AppConfig.java - 新增 ClientUpdateConfig 配置类 - mcpatch.yml - 新增 client-update 配置项 功能特性: - 版本检查(支持多渠道:stable/beta/alpha) - SHA-256 校验验证 - 自动备份和回滚 - 延迟安装(避免 JAR 文件锁定问题)
新增功能: - 自动检查 GitHub Release 最新版本 - 国内镜像加速支持(API 和下载分开) - 超时自动切换镜像站 - 跨平台支持(Windows/Linux/macOS/Android) - 进度窗口显示(可选) - 版本比较和更新日志展示 - SHA-256 校验验证 - 备份和回滚机制 新增文件: - GitHubMirror.java: 镜像站管理 - GitHubReleaseClient.java: GitHub API 客户端 - PlatformPathResolver.java: 跨平台路径解析 - SelfUpdateWindow.java: 进度窗口 - 测试类若干 修改文件: - Main.java: 添加自更新检查入口 - AppConfig.java: 添加 ClientUpdateConfig 配置类 - mcpatch.yml: 添加 client-update 配置项
- Files.writeString() -> Files.write(path, bytes) - Files.readString() -> new String(Files.readAllBytes(path)) - Path.of() -> Paths.get()
项目已有 release.yml,不需要额外的工作流文件
- 移除 Main.java 中的调试日志 - 移除 GitHubMirror.java 中的 testAllMirrors 方法
- 删除 convertToMirrorUrl()(已被 convertApiUrl/convertDownloadUrl 替代) - 删除 markCurrentMirrorSuccess()(已被 markApiMirrorSuccess/markDownloadMirrorSuccess 替代)
问题:parseGitHubRelease 返回的 downloadUrl 已带镜像前缀, 然后 downloadNewVersion 再次添加前缀导致套娃 修复:parseGitHubRelease 只返回原始GitHub URL, 由下载器决定是否使用镜像
- 新增 MultiThreadDownloader 多线程下载器 - 支持4线程并行下载 - 自动分片、合并、校验 - 小文件自动降级为单线程下载 - 镜像切换时自动清理分片文件
- 修复 SelfUpdateInstaller 路径遍历漏洞(严重) 添加白名单目录校验,防止任意文件替换 - 修复 GitHubReleaseClient httpGetDirect 资源泄露(高) 补充 try-finally 确保连接关闭 - 修复 MultiThreadDownloader 无界线程池(高) 替换为有界线程池,daemon线程防止泄露
- SEC-02: Work.java 路径遍历(已由 PathUtility.validateServerPath 修复) - SEC-03: Main.java YAML反序列化改用安全Constructor - SEC-05: WebdavProtocol.java 凭据改为private - SEC-09: HashUtility.java CRC改为局部实例(线程安全) - SEC-14: Log.java stop()修复onStart→onStop
- SEC-13: searchDotMinecraft 显式null检查替代NPE catch - SEC-17: 开发模式路径白名单仍校验文件名后缀 - SEC-18: 尝试从GitHub API digest字段获取checksum - SEC-11: McpatchProtocol添加64MB大小上限防OOM - SEC-15/21: AlistProtocol异常路径关闭Response
- 删除 GitHubMirror、GitHubReleaseClient - 新增 ServerVersionClient 从服主服务器获取版本 - 重写 SelfUpdateManager 使用新接口 - 修复 MultiThreadDownloader 单线程 206 判断 - 删除自动 release workflow
- HashUtility: 实现对象池减少 GC 压力 - MultiThreadDownloader: 改用 OkHttp,支持配置文件 headers - 修复单线程下载 206 判断 - 缩短超时时间到 15s/60s
- 添加批量下载方法,优化大量小文件场景 - 使用信号量控制并发,避免线程过多 - 完成所有9条甲方要求
- 符合甲方发布流程:手动创建 release + tag → 自动构建 - 不自动生成 changelog,由甲方手写更新记录 - 简化 workflow,只做构建和发布
- 将 installPendingUpdate() 移到 main/premain 入口最开始 - 使用重命名交换方案绕过 Windows 文件锁定 - performSelfUpdate() 只负责检查和下载,不负责安装 - installPendingUpdate() 失败不报错,继续正常运行
问题原因:getWritableUpdateDirectory() 每次重新计算,导致: - 下载时:路径A - 检查时:路径B - 文件存在但路径不一致,找不到 修复:添加 cachedUpdateDirectory 缓存
问题:Main.java 设置 githubRepo/mirror,但 SelfUpdateManager 读取 server-url 修复: - ClientUpdateConfig 添加 serverUrl 字段 - Main.java 传递 serverUrl 而非旧字段 - 标记 githubRepo/mirror 为 @deprecated
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.
feat: 实现客户端自动更新功能
概述
本 PR 实现了 Mcpatch2JavaClient 客户端自动更新功能,允许客户端在启动时自动检查 GitHub Release 并下载新版本,下次启动时自动安装。
功能特性
实现原理
1. 更新流程
2. 延迟安装策略
由于 Java Agent 运行时会锁定 JAR 文件,无法在运行时直接替换。采用"延迟安装"策略:
3. 文件存储位置
所有文件存储在 JAR 同目录,避免被系统清理:
4. 镜像加速策略
API 和下载使用不同的镜像站列表,优先使用
ghfile.geekertao.top:https://ghfile.geekertao.top/https://gh.bugdey.us.kg/https://github.dpik.top/https://ghfile.geekertao.top/https://hk.gh-proxy.org/https://gh-proxy.org/https://cdn.gh-proxy.org/https://edgeone.gh-proxy.org/切换策略:超时自动切换下一个镜像站,所有镜像失败后回退到原始 GitHub 链接。
5. 多线程下载
针对 7.4MB 的客户端文件,使用 6 线程并行下载,每片约 1.23MB:
架构设计
模块划分
类图
配置说明
mcpatch.yml 新增配置
核心代码解析
1. 版本比较逻辑 (SelfUpdateChecker.java)
支持预发布版本后缀比较(如
0.0.13-beta < 0.0.13):2. 镜像切换逻辑 (GitHubMirror.java)
3. 多线程下载 (MultiThreadDownloader.java)
文件变更清单
新增文件 (10个)
ClientVersionInfo.javaGitHubMirror.javaGitHubReleaseClient.javaSelfUpdateManager.javaSelfUpdateChecker.javaSelfUpdateDownloader.javaMultiThreadDownloader.javaSelfUpdateInstaller.javaSelfUpdateWindow.javaPlatformPathResolver.java修改文件 (8个)
Main.javaAppConfig.javamcpatch.ymlWork.javaHttpProtocol.javaWebdavProtocol.javaAlistProtocol.javaMcpatchProtocol.java安全审计
审计范围
对整个项目 46 个 Java 文件进行了全面安全审计,共发现 20 个安全问题,已修复 13 个。
已修复漏洞
PathUtility.validateServerPath()三级校验new Constructor(new LoaderOptions()).jar.new后缀剩余低风险问题(设计如此或影响极小)
Bug 修复
parseGitHubRelease返回原始 URL,由下载器添加镜像前缀hk.gh-proxy.org优先,后添加ghfile.geekertao.top为首选convertToMirrorUrl、markCurrentMirrorSuccess、testAllMirrorsSelfUpdateTest.java兼容性
注意事项
github-repo必须设置