Skip to content

fix(build): 修复 Maven 发布模型与 Java 8 门禁#719

Open
zhibeigg wants to merge 1 commit into
TabooLib:dev/6.3.0from
zhibeigg:fix/703-build-publishing-java8
Open

fix(build): 修复 Maven 发布模型与 Java 8 门禁#719
zhibeigg wants to merge 1 commit into
TabooLib:dev/6.3.0from
zhibeigg:fix/703-build-publishing-java8

Conversation

@zhibeigg

@zhibeigg zhibeigg commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

原有问题

现有 Gradle 发布配置和 Java 8 约束只保证“能够构建”,不能保证“发布后可被消费者正确使用”:

  • 部分 Maven POM 丢失 api / compileOnlyApi 依赖,消费者拿到主 JAR 后无法自动解析所需模块或外部库。
  • 纯聚合、空占位项目可能发布无意义制品;同时 common-reflex 和平台实现等实际运行所需制品又可能被错误排除。
  • plain JAR、Shadow JAR 和 classifier 的关系不明确,Maven 主制品可能不是预期的可运行 Shadow 内容,sources 制品也缺少统一保证。
  • sourceCompatibility=1.8 或 Kotlin jvmTarget=1.8 只限制字节码格式,使用新 JDK 编译时仍可能误调用 Java 9+ API。
  • 新 JDK 上的 UnsafeList.reversed() 解析可能绑定到 Java 8 不存在的 API。

典型触发场景与后果

  • 下游插件仅声明一个 TabooLib Maven 坐标:POM 缺少依赖时编译报缺类,或运行时出现 NoClassDefFoundError
  • 仓库发布了空父项目或占位模块:消费者能够解析坐标,却得到空 JAR;反之缺少平台 impl 时运行期服务实现无法加载。
  • Maven 主制品误指向 plain JAR:重定位依赖不存在或与服务端冲突,Shadow 内容只能通过非标准 classifier 获取。
  • 在 JDK 17/21 上编译、Java 8 服务端运行:构建阶段成功,但运行时因 Java 9+ 方法产生 NoSuchMethodError / NoClassDefFoundError

本 PR 修改

  • 为有效模块生成包含 apicompileOnlyApi compile 依赖的 Maven POM,并验证内部坐标版本一致。
  • 明确可发布模块规则:过滤纯聚合和空占位项目,同时保留 common-reflex、数据库模块和各平台实现制品。
  • 将 Shadow JAR 作为无 classifier 的 Maven 主制品,并为每个 publication 统一发布 sources JAR;plain JAR 不再与主制品冲突。
  • 增加 verifyPublishingModel,检查发布清单、禁止模块、POM 依赖和制品选择。
  • Java 编译启用 --release 8;Kotlin/最终 class 增加 Java 8 API 签名及 class major 门禁。
  • Unsafe 改为反射访问,并修复两处在新 JDK 上会误绑定 Java 21 List.reversed() 的调用。

修改目的

让 Maven 仓库中的坐标、POM 和实际 JAR 内容保持一致,并在构建阶段阻止任何只能在 Java 9+ 运行的 API 进入 Java 8 兼容制品。

兼容性与行为变化

  • 运行时公开 API 不变。
  • Maven 主制品统一为 Shadow JAR,依赖关系通过 POM 明确暴露。
  • 错误的空模块不再发布,实际运行需要的实现模块会正常发布。
  • Java 8 不兼容调用会在构建门禁阶段失败,而不是留到用户服务器运行时失败。

验证

  • ./gradlew verifyJava8Compatibility --no-parallel
  • ./gradlew verifyPublishingModel --rerun-tasks --no-parallel
  • ./gradlew :common:test :module:incision:test :module:minecraft:minecraft-kether:test --no-parallel
  • ./gradlew :common-legacy-api:build :module:database:build :module:database:database-ptc-object:build --no-parallel
  • Maven Local 抽查:common-reflexcommon-legacy-apidatabasedatabase-ptc-objectplatform-bukkit-impl
  • 最终集成验收发布 57 个有效 publication,扫描 9257 个常规 class,最高 major 为 52

Refs #703

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant