开发与构建 - lmxdg/ZeroLogin GitHub Wiki
开发与构建
本页面向希望从源码构建或参与开发的用户。
环境要求
| 工具 | 版本 |
|---|---|
| JDK | 17 或更高 |
| Maven | 3.8+ |
| 网络 | 可访问 PaperMC 仓库与 Maven 中央仓库 |
构建
git clone https://github.com/lmxdg/ZeroLogin.git
cd ZeroLogin
mvn clean package
产物:target/ZeroLogin-<版本>.jar(约 14 MB,已内联并 relocate SQLite JDBC 驱动)
运行测试
mvn test
共 43 个单元测试,覆盖:
- 口令散列(加盐、校验、参数升级、畸形输入容错)
- 密码校验规则(长度、混合字符)
- 消息解析(语言归一化、auto 回退)
- 账号编解码(转义、往返、损坏检测)
- 文件存储读写(保存 / 加载 / 删除 / 改名 / 损坏跳过)
- SQLite 存储读写(建库、UPSERT、改名、批量 saveAll、重启持久化)
- 后端间数据迁移(file → sqlite、sqlite → file、目标非空中止、force 备份、同名冲突跳过)
兼容性门禁
这是本项目保证"单 JAR 兼容 1.20 ~ 26.1.2"的核心手段:针对 API 上下限分别编译,只有源码仅使用两端点 API 交集时才能双双通过。
mvn clean package # 对齐 1.20.1 API(下限)
mvn -Papi-latest clean package # 对齐 26.1.2 API(上限)
两条命令均编译通过,才说明单 JAR 在全区间可用。另有 api-1202、api-12111 两个中间版本 Profile 用于额外抽查。
兼容性设计三要点
-
api-version: '1.20'Paper 采用「api-version≤ 服务端版本即允许加载」规则,声明 1.20 可被 1.20 与 26.x 同时加载。 -
编译目标 Java 17 1.20 运行于 Java 17,26.x 运行于 Java 25。Java 17 字节码(major 61)可直接在 Java 25 JVM 上运行,无需多版本构建。
-
只用 API 交集 开发期对 1.20.1 与 26.1.2 两个
paper-api包做类与方法签名的逐一比对,确保调用的 API 在两端均存在。
项目结构
src/main/java/dev/zerologin/
├── ZeroLoginPlugin.java # 插件主类:装配与生命周期、存储切换、旧数据自动导入
├── auth/
│ ├── AuthService.java # 纯认证逻辑(密码规则、散列、校验)
│ ├── PasswordHasher.java # PBKDF2 散列实现
│ └── SessionManager.java # 内存会话与 IP 会话窗口
├── command/ # 各命令执行器(含 /zerologin 的 5 个子命令)
├── config/Settings.java # 配置强类型读取
├── listener/AuthListener.java # 未认证保护拦截
├── locale/Messages.java # 本地化:7 语言、auto 解析、模板导出
└── storage/
├── AuthStore.java # 存储抽象(全部方法返回 CompletableFuture)
├── AuthRecord.java # 账号数据载体
├── FileAuthStore.java # 文件后端(v1.0)
├── SqliteAuthStore.java # SQLite 后端(WAL + 专用 IO 线程)
├── StorageMigrator.java # 后端间非破坏式迁移
└── AccountCodec.java # 账号文件编解码
src/main/resources/
├── plugin.yml # 插件描述(api-version: '1.20')
├── config.yml # 默认配置
├── messages_zh_cn.yml # 简体中文消息
├── messages_zh_tw.yml # 繁體中文消息
├── messages_en_us.yml # 英文消息
├── messages_ja_jp.yml # 日本語メッセージ
├── messages_ko_kr.yml # 한국어 메시지
├── messages_ru_ru.yml # Русские сообщения
└── messages_es_es.yml # Mensajes en español
src/test/java/dev/zerologin/ # 单元测试(43 个)
设计原则
- 认证逻辑与 Bukkit 解耦:
AuthService/PasswordHasher/AccountCodec/FileAuthStore/SqliteAuthStore不依赖 Bukkit,可直接单测。 - 加密零外部依赖:仅用 JDK 自带加密实现,避免依赖冲突与类加载隔离问题。
- 存储后端抽象:认证流程只依赖
AuthStore接口,StorageMigrator同样只面向接口,未来新增后端(如 MySQL)无需改认证与迁移代码。 - 异步 IO:SQLite 的所有 SQL 在专用 IO 线程串行执行,调用方拿到
CompletableFuture,主线程零阻塞。 - 账号文件自包含:
file后端用自研AccountCodec序列化,不依赖 Bukkit YAML,规避跨版本配置 API 变动。