Gradle 项目转 Maven 需手动配置 maven-publish 插件并执行 generatePomFileForMavenJavaPublication 任务,生成 pom-default.xml 后重命名为 pom.xml;多模块聚合与继承结构需人工设计,插件和构建流程不自动转换。

Gradle 本身不提供全自动、100% 无损的 pom.xml 到 build.gradle 的转换工具,但可以通过组合官方插件和合理策略,实现“快速”且“基本无缝”的迁移——关键在于理解 Maven 和 Gradle 的模型差异,并聚焦于核心依赖、插件、构建逻辑的等价映射。
用 gradle init 自动生成基础结构
这是最直接的起点。在已有 Maven 项目根目录(含 pom.xml)下运行:
- gradle init --type pom(Gradle 6.0+ 支持)会解析 pom.xml,生成 settings.gradle 和 build.gradle(基于 Groovy)或 build.gradle.kts(Kotlin DSL)
- 它能自动识别 groupId、artifactId、version、dependencies、plugins(如 maven-compiler-plugin → JavaPlugin)、source directories 等基础信息
- 注意:多模块项目需确保各子模块都有 pom.xml,且父 pom 中定义了 modules;init 命令会递归处理并生成对应的 settings.gradle
手动校验与补全关键差异点
自动生成的脚本通常覆盖 70–80% 场景,但以下部分需人工确认或调整:
-
依赖范围(scope)映射:Maven 的
test→ Gradle 的testImplementation;provided(非标准)需改用compileOnly+testCompileOnly;runtime对应runtimeOnly -
构建插件逻辑:如 Maven 的
maven-surefire-plugin配置(如 forkCount、argLine)需转为 Gradle 的test { ... }块;maven-jar-plugin的 manifest 配置对应jar { manifest { ... } } -
资源过滤与 profiles:Maven 的
<resources>+filtering=true可用 Gradle 的processResources { from(...) { expand(...) } }实现;Maven profiles 没有直接等价物,推荐改用 Gradle 的if (project.hasProperty("env")) { ... }或variant-aware dependency management替代
统一使用 Kotlin DSL 提升可维护性
如果团队熟悉 Kotlin,建议将生成的 Groovy build.gradle 改为 build.gradle.kts:
立即学习“Java免费学习笔记(深入)”;
- Kotlin DSL 类型安全更强,IDE 支持更好(自动补全、编译期检查),避免 Groovy 的运行时语法陷阱
- 迁移只需重命名文件 + 将
dependencies { implementation '...' }等语法稍作调整(如字符串引号、函数调用风格),Gradle 自带的gradle kotlinDslAccessorsReport可辅助定位 API 变更 - 多模块项目中,可在 root build.gradle.kts 里用
subprojects { ... }统一配置 Java 版本、编码、仓库等,比 Maven 的 parent pom 更灵活
验证与渐进式切换策略
迁移后务必验证行为一致性,而非仅看构建成功:
- 执行
./gradlew clean build并比对 target/ 和 build/libs/ 下产物的 jar 内容(特别是 MANIFEST.MF、META-INF/maven/ 结构是否符合预期) - 用
./gradlew dependencies检查依赖树是否与mvn dependency:tree一致;如有差异,重点排查 BOM 导入(Gradle 推荐platform(...)或enforcedPlatform(...)) - 初期可保留 pom.xml 和 build.gradle 并行存在,CI 中双轨运行(如 Maven 构建发布 snapshot,Gradle 构建做 smoke test),待稳定性达标后再移除 Maven


















