java-run 从 Java 源码工作区选择启动目标,由 Maven 或 Gradle 准备源码和运行依赖,再启动 Java。 使用契约见 README,模块职责见 架构设计,演进方向见 技术路线。
- 使用
.bun-version指定的 Bun,并按仓库锁文件安装依赖 - 在 PATH 中提供 JDK 的
java、javac和jar - 安装 Maven 和 Gradle,用于真实项目验收;首次运行可能下载插件与依赖
CI 使用 JDK 17 / 21 和 Gradle 8.14,夹具以 Java 17 为最低版本。 目标项目存在 Wrapper 时,运行器优先使用 Wrapper;项目自身的 JDK 和构建工具要求仍需满足。
bun install --frozen-lockfile
bun run check
bun run compile
bun run smoke| 命令 | 验证内容 |
|---|---|
bun run typecheck |
TypeScript 类型检查 |
bun test |
参数、配置、初始化、适配器、主类、类路径、交互和进程行为回归 |
bun run check |
类型检查与回归测试 |
bun run compile |
构建本机独立二进制及 .sha256 校验文件到 dist |
bun run smoke |
使用该二进制运行真实 Maven / Gradle 夹具 |
回归测试中的真实 Gradle 用例使用 PATH 中的 Gradle,找不到时会跳过。
可用 JAVA_RUN_TEST_GRADLE 指定命令,并用 GRADLE_USER_HOME 隔离测试缓存:
GRADLE_USER_HOME=/tmp/java-run-test-gradle \
JAVA_RUN_TEST_GRADLE=/path/to/gradle \
bun run check本地编译和发布构建共用 bun run compile。
默认输出 dist/java-run,Windows 自动使用 .exe 扩展名。
可用等号形式指定目标与输出路径:
bun run compile --target=bun-darwin-arm64 --outfile=dist/java-run可用目标见下方发布平台表。
编译成功后,在二进制旁生成 <二进制文件名>.sha256,自定义输出路径也遵循这一规则。
校验文件采用标准 SHA-256 清单格式,文件名相对于其所在目录。
二进制不自动加载运行目录中的 .env 或 bunfig.toml,显式继承的环境变量仍然生效。
smoke 将夹具复制到临时目录,使用独立的 Maven settings、本地仓库和 Gradle 用户目录。 它从被测二进制的 PATH 中移除当前 Bun 安装目录,验证产物可独立运行。
bun run smoke --suite=quick
bun run smoke --fixture=gradle-reactor
bun run smoke --cli=/path/to/java-run --suite=full --keep| 选项 | 范围 |
|---|---|
--suite=quick |
帮助、版本、静态预览、基本启动、初始化与配置复用 |
--suite=full |
默认套件;在 quick 基础上验证测试类路径、配置优先级、资源与依赖更新、非零退出 |
--fixture=<名称> |
限定项目夹具,保留帮助、版本和预览检查 |
--cli=<路径> |
指定待验收的二进制,默认使用 dist 中的本机产物 |
--keep |
成功后也保留临时目录 |
成功后默认清理临时目录;失败时保留项目副本及逐项 stdout / stderr 日志,并输出保留位置。 具体夹具与观测标记见 夹具说明,验收项数以脚本输出为准。
需要复用下载时,指定专用测试缓存:
JAVA_RUN_MAVEN_REPOSITORY=/tmp/java-run-test-maven \
JAVA_RUN_GRADLE_HOME=/tmp/java-run-test-gradle \
JAVA_RUN_GRADLE_COMMAND=/path/to/gradle \
bun run smoke测试缓存应独立于个人 ~/.m2 和 ~/.gradle。
JAVA_RUN_GRADLE_COMMAND 控制 smoke 的 Gradle 命令,JAVA_RUN_TEST_GRADLE 控制回归测试的 Gradle 命令。
smoke 也接受 JAVA_RUN_SMOKE_SUITE、JAVA_RUN_SMOKE_FIXTURE 和 JAVA_RUN_SMOKE_KEEP=1,同名命令行选项优先。
从主分支创建具有单一意图的工作分支,如 feat/gradle-project-selection 或 fix/process-exit-code。
修改前检查工作区并保留其他人的未提交内容;同时处理独立修改时使用隔离分支或 worktree。
提交遵循 Conventional Commits:type 与 scope 使用英文,subject 使用中文,例如:
feat(cli): 支持交互生成启动配置
fix(maven): 保留选定项目的运行依赖范围
test(gradle): 验证无关应用不参与编译
docs: 说明参数传递规则
提交按可审查的意图拆分,排除无关改动、生成产物和依赖缓存。 提交前检查差异并运行相关验证;PR 说明应写清触发场景、最终行为、实际测试结果和未验证的平台。
源码注释使用中文,说明必要的契约、边界和原因。 公开 API 的说明放在所属接口、字段或方法,架构取舍放入设计文档。 Markdown 正文使用正常中文标点,同组列表保持语法与标点统一。 较长段落按主题拆分,Markdown 源文件按语义换行。
行为修改应验证调用者可以观察到的结果。 构建工具适配的修改需要真实项目验收,模拟输出用于覆盖具体边界。
回归重点包括:
- 单项目与多模块目标、上游依赖和无关项目隔离
- 自动准备与
--build=none,模型、资源或依赖变化后的重新解析 - 主类声明、唯一入口、多个入口和无入口
- JVM、应用和构建参数边界,以及空格、中文、
#、%等字符 - 默认测试隔离和显式测试类路径
- 正常与非零退出、平台对应的信号处理和进程树清理
- 帮助、版本和静态预览的无构建行为
- 终端选择、非 TTY 行为、EOF / Ctrl+C 取消和退出码
init保存后重复运行、参数保留、已有配置保护与--force重新生成- 初始化失败或取消时保留已有配置
测试在临时项目或夹具副本中运行,保持 tests/fixtures 和用户提供的源仓库不变。
环境和信号测试使用隔离子进程,平台专用测试的跳过条件应与实际系统能力对应。
跨平台结论以对应系统上的执行结果为依据,跳过的测试不计为通过验收。
Check 工作流 在分支 push、PR 和复用调用时运行。 Linux、macOS、Windows 与 JDK 17 / 21 组成六组矩阵,分别执行锁文件安装、类型检查、回归测试、本机编译和完整 smoke。 最新结果可在 GitHub Actions 查看。
| 工作流 | 入口 | 验收与输出 |
|---|---|---|
| Prepare Release | 在 master 手动输入新版本 |
创建临时发布分支、更新版本号并提交发布 PR |
| Release Verify | 分支 push 命中 paths |
五平台产物演练,保存 Actions artifacts 和发布说明预览;Check 独立运行 |
| Release Verify | 手动运行 | 五平台产物演练,并复用完整 Check |
| Publish | 在 master 手动运行 |
校验发布条件,执行完整 Check 和五平台验收,通过后创建标签并发布 GitHub Release |
paths 限制分支演练的触发范围,包括工作流、发布脚本、相关测试、版本配置和安装指南等,完整清单以工作流为准。
手动入口不受路径条件限制。工作流进入默认分支后,可通过 Actions 页面或 GitHub CLI 运行。
Publish 复用 Release Verify 的构建与验收步骤;标签由发布流程创建,推送标签不会触发发布。
平台清单 统一定义编译目标、原生 runner、包内目录和公开资产名称:
| ZIP 资产 | 编译目标 | 原生 runner |
|---|---|---|
java-run-windows-x64.zip |
bun-windows-x64 |
windows-2025 |
java-run-linux-x64.zip |
bun-linux-x64 |
ubuntu-24.04 |
java-run-linux-arm64.zip |
bun-linux-arm64 |
ubuntu-24.04-arm |
java-run-darwin-arm64.zip |
bun-darwin-arm64 |
macos-15 |
java-run-darwin-x64.zip |
bun-darwin-x64 |
macos-15-intel |
每个平台依次执行:
- 编译一次待分发的二进制及校验文件,在 JDK 21 下执行完整 smoke。
- 核对源二进制校验和,并打包 ZIP。Linux / macOS 使用
zip,Windows 使用 PowerShellCompress-Archive。 - 解压实际 ZIP,核对文件集合、内容、二进制校验和及 Unix 可执行权限。
- 使用 JDK 17 对解压出的二进制执行 quick 验收,再上传 ZIP。
每份 ZIP 只有一个 java-run-<平台>/ 目录,包含:
java-run或java-run.exe- 对应的
java-run.sha256或java-run.exe.sha256 - 从 安装指南 复制的
INSTALL.md - MIT 许可证
LICENSE
汇总步骤要求恰好包含五种非空 ZIP 普通文件,然后生成并核对 SHA256SUMS。
包内 .sha256 校验二进制,Release 单独提供的 SHA256SUMS 校验下载的 ZIP。
资产名称不带版本号,指定版本通过 /releases/download/v<版本>/ 下载,最新稳定版使用 /releases/latest/download/。
源码 Check 在两个 JDK 上均执行完整回归;发布产物在 JDK 21 上执行 full,在 JDK 17 上执行 quick。 Linux 产物在 Ubuntu 24.04 的 glibc 环境验收,musl 和其他系统版本未纳入验证范围。
scripts/release.ts 读取当前 package.json 的版本,提供五个子命令:
| 子命令 | 职责 |
|---|---|
metadata |
校验版本,输出标签、预发布标识和平台矩阵;加 --publish 时还要求存在非空许可证文件 |
package <平台> |
打包 dist 中已有的二进制与校验文件,解压核对并执行 quick |
checksums |
核对 dist 中的五份 ZIP 集合,生成 SHA256SUMS |
notes |
向标准输出生成下载与安装说明 |
verify-assets |
从标准输入读取远端资产名称的 JSON 数组,核对五份 ZIP 和 SHA256SUMS 是否齐全且无额外文件 |
在对应平台的原生机器上构建并验收 ZIP,例如 macOS arm64:
bun scripts/release.ts metadata
bun run compile
bun run smoke --suite=full
bun scripts/release.ts package darwin-arm64package 输出 dist/java-run-darwin-arm64.zip,其 quick 验收使用当前环境的 JDK。
本地复现发布矩阵时,先用 JDK 21 编译和执行 full,再切换到 JDK 17 执行 package。
五个平台的 ZIP 汇集到只含这些文件的 dist 目录后,可执行 checksums。
编译留下的裸二进制和 .sha256 不属于汇总输入。
分支与手动演练保存产物和说明预览,不创建标签或 GitHub Release。
metadata 根据当前源码生成元数据,不依赖所在分支或标签。
scripts/publish-release.ts 由 Publish 工作流调用,不属于本地演练步骤。
项目采用 MIT 许可证,发布压缩包包含许可证原文。 在仓库 Settings → Actions → General → Workflow permissions 中启用 Allow GitHub Actions to create and approve pull requests,允许 Prepare Release 创建发布 PR。 组织级策略也需要允许此设置。
每个版本按以下流程准备与发布:
- 将本次要发布的功能与修复合入
master。 - 在 Actions 打开 Prepare Release,点击 Run workflow,选择
master, 输入不带v的新版本,如0.1.0或0.1.0-rc.1。 - 审查自动创建的发布 PR。若页面显示 Approve workflows to run, 按 GitHub 工作流触发规则批准运行, 等待检查通过后合并。
- 在 Actions 打开 Publish,点击 Run workflow,选择
master,执行正式发布。 - 发布完成后,检查 Release 的标签、下载表、ZIP 内容和校验和, 并按安装指南核对下载后的版本输出;临时发布分支可删除。
Prepare Release 从本次手动运行绑定的提交创建 release/<版本> 分支,仅修改 package.json 的版本号。
新版本必须符合 SemVer,并高于该提交中的当前版本。
工作流保留已有分支和标签,也不会同时创建多个待合并的发布 PR。
需要手动准备版本时,可使用 bun run version 调整 package.json,再通过 PR 合入 master。
该命令不自动提交、创建标签或推送;合并后的发布入口同样是 Publish。
Publish 从所选提交的 package.json 读取版本,无需再次输入版本号。
整次运行锁定触发时的 master 提交,后续主分支更新不会改变本次待发布代码。
工作流先校验版本、许可证、提交归属及已有标签与 Release,再对同一提交并行执行六组 Check 和五平台产物验收。
全部通过后,创建指向该提交的 v<版本> 附注标签,以及对应的未公开草稿,上传五份 ZIP 和 SHA256SUMS。
Release 正文包含下载表、安装说明及 GitHub 生成的变更说明。
公开前会核对远端资产集合,缺失或额外文件均使流程失败并保留草稿。 上传和核对成功后自动公开,无需额外人工审批。 预发布版本标记为 prerelease,且不标记为 latest;稳定版的 latest 选择使用 GitHub 默认规则。 正式发布运行串行执行,不中断正在进行的发布。
网络、下载或上传偶发失败时,可重跑失败任务:
gh run rerun <run-id> --failedPrepare Release 的原始运行可以重跑,恢复同版本、同起点的分支和 PR。 主分支前进后再次点击 Run workflow 会绑定新的起点,不会覆盖此前创建的发布分支。 如需调整已有发布准备,直接在对应 PR 中修改并接受检查。
Publish 重跑使用原始提交和 ref,已验收的 Actions artifacts 支持同名覆盖。
流程可以复用指向同一提交的已有标签,并恢复未公开草稿;指向其他提交的标签和已公开版本会被拒绝。
Release 资产只允许在未公开草稿中替换。
修改代码后应通过 PR 合入 master,再运行新提交的验收;已发布版本的修正通过新版本发布。