
本文介绍如何通过 openrewrite 自动化工具,将 optaplanner 项目(v8 或 v9)无缝升级至 timefold,无需手动修改导入语句、依赖或配置,全程只需一条命令即可完成迁移与验证。
本文介绍如何通过 openrewrite 自动化工具,将 optaplanner 项目(v8 或 v9)无缝升级至 timefold,无需手动修改导入语句、依赖或配置,全程只需一条命令即可完成迁移与验证。
Timefold 是 OptaPlanner 的官方演进分支,自 2023 年起独立发展,致力于提升性能、简化 API 并增强可维护性。为降低迁移门槛,Timefold 团队提供了官方支持的自动化迁移工具——基于 OpenRewrite 的 timefold-solver-migration 插件,可批量完成包名替换(如 org.optaplanner → ai.timefold.solver)、依赖坐标更新、注解重映射及配置适配等全部工作。
✅ 迁移前准备:选择对应版本
确保版本兼容性是成功迁移的前提:
- 若当前使用 OptaPlanner 8.x(如 8.29.x),请选用 Timefold 0.8.x(推荐最新补丁版,如 0.8.39);
- 若已升级至 OptaPlanner 9.x(如 9.50.x),则应迁移到 Timefold 1.x(当前稳定版为 1.0.0,注意:0.9.x 属于预发布过渡系列,生产环境建议等待 1.0.0+)。
⚠️ 注意:Timefold 1.x 不再兼容 Java 11,最低要求 JDK 17;同时弃用了部分 OptaPlanner 9 中已标记 @Deprecated 的 API,请在迁移后检查编译警告。
? 执行自动化迁移(Maven 示例)
在项目根目录下运行以下 Maven 命令(无需修改 pom.xml 或源码):
mvn org.openrewrite.maven:rewrite-maven-plugin:4.46.0:run \ -Drewrite.recipeArtifactCoordinates=ai.timefold.solver:timefold-solver-migration:0.8.39 \ -Drewrite.activeRecipes=ai.timefold.solver.migration.ToLatest
Gradle 用户请参考 Timefold 官方迁移文档 获取对应 build.gradle 配置片段(需添加 rewrite-gradle-plugin 及插件仓库)。
该命令将自动执行:
- 替换全部 org.optaplanner.* 包导入为 ai.timefold.solver.*;
- 更新 pom.xml 中的依赖坐标(optaplanner-solver → timefold-solver-core 等);
- 调整 @PlanningSolution、@PlanningEntity 等核心注解的包路径;
- 修正 SolverFactory 创建方式及 ScoreDirector 相关调用。
✅ 验证与收尾
迁移完成后,务必执行完整构建并运行求解器,重点关注日志中的性能指标:
INFO Solving ended: ... score calculation speed (128450/sec) ...
对比迁移前的 score calculation speed 数值——Timefold 在多数场景下可提升 20%~50% 的计算吞吐量(得益于 JIT 优化与新评分器设计)。若速度未提升或出现 ClassNotFoundException,请检查是否遗漏 JDK 版本升级或存在自定义 ScoreCalculator 未被自动适配(需手动重构为 ConstraintProvider)。
最后,提交所有变更(包括 pom.xml、Java 源文件及可能生成的 rewrite.yml),即完成标准化迁移流程。
? 提示:建议在迁移前提交 Git 快照,并启用 --dry-run 参数先行预览变更(如添加 -Drewrite.dryRun=true),避免误操作影响开发进度。











