# 构建与发布

仓库不依赖全局 Gradle；根工程和四个平台均提交各自 Wrapper。Node.js 只用于生成嵌入 JAR 的管理界面。

## 本地完整构建

Linux：

```bash
export JAVA_HOME_17=/path/to/jdk-17
export JAVA_HOME_21=/path/to/jdk-21
bash scripts/verify-wrappers.sh
bash scripts/build-all.sh 1.0.0
```

Windows PowerShell：

```powershell
.\build-all.cmd
```

直接运行时，Windows 脚本读取四个平台 `gradle.properties` 中的 `mod_version`，并要求它们保持一致，然后构建 Web UI 与四个 JAR。`-Version 2.0.0` 仅用于临时覆盖配置版本，不是必填项。需要同时执行 Web 与 Java 测试时使用 `.\build-all.cmd -WithTests`。脚本会自动寻找 JDK 17/21 以及 ForgeGradle Mavenizer 所需的 JDK 25+；也可用 `-Java17Home`、`-Java21Home`、`-ToolJavaHome` 显式指定。先运行 `.\build-all.cmd -PreflightOnly` 可以只检查环境而不构建，重复开发构建可增加 `-SkipNpmInstall`。

脚本依次校验 Wrapper、构建 Web UI，然后用 JDK 17 构建 1.20.1、用 JDK 21 构建其余三个版本；`-WithTests` 还会运行 Web、公共 Java 与平台测试。最终目录只包含四个可分发 JAR 和 `SHA256SUMS`；`slim`、sources 和 javadoc JAR 不会被误发布。

## CI 与发布

仓库中的 `.github/workflows/ci.yml` 面向 GitHub Actions 和 GitHub Release。若主 Git 远端托管在不提供兼容 Actions 的自建服务上，必须另行配置受保护的 GitHub/兼容镜像与发布凭据；不能假定仅推送该主远端就会运行这套流水线。未配置镜像时应使用上面的本地完整构建脚本并人工保管校验和，但这不替代 CI 证据。

- Wrapper 同时由 Gradle 官方校验数据库和仓库固定 SHA-256 校验。
- 公共模块在 Ubuntu 与 Windows 测试，覆盖 SQLite 原生库加载和跨平台路径。
- Web UI 与四个 Forge 根并行形成独立构建证据。
- `v*` 标签触发 GitHub Release；标签去掉前导 `v` 后作为模组版本。
- Release 包含四个 JAR、CycloneDX JSON SBOM 和覆盖全部资产的 `SHA256SUMS`。

发布标签只应指向已通过专服启动、原版客户端握手、优雅停止和数据库重启恢复验收的提交。CI 编译成功不能替代这四项运行时验证。

## 产物命名

```text
xfeservermanager-forge-1.20.1-<version>.jar
xfeservermanager-forge-1.20.6-<version>.jar
xfeservermanager-forge-1.21.1-<version>.jar
xfeservermanager-forge-1.21.11-<version>.jar
```

不要重命名一个版本的产物并用于另一个 Minecraft 版本。
