Gradle 多模块项目转 Maven POM 文件指南
核心目标
将现有的 Gradle 多模块项目结构转换为 Maven 兼容的 pom.xml 文件,为项目迁移或双构建系统支持做准备。
环境与前提
-
IDE: IntelliJ IDEA 2024
-
构建工具
-
JDK: 11
重要提示: 确保项目
build.gradle中的依赖配置清晰有序,避免依赖混乱导致转换错误。
转换原理
Gradle 的 maven-publish 插件能够分析项目的依赖关系和配置,自动生成对应的 Maven POM 文件。这个过程主要转换:
-
项目坐标 (groupId, artifactId, version)
-
依赖项及其作用域
-
基础项目信息
限制与注意事项
-
自动化转换主要处理依赖关系
-
Maven 的聚合与继承结构需要手动设计
-
插件配置和构建流程需要额外处理
添加必要插件
在每个需要生成 POM 的模块的 build.gradle 文件中,添加 java 和 maven-publish 插件
// 示例:单个模块的 build.gradle 顶部
plugins {
id 'java'
id 'maven-publish'
// 其他插件...
}
配置发布出版物
在同一个 build.gradle 文件中,添加 publishing 块来定义 Maven 发布物。
publishing {
publications {
// 'mavenJava' 是自定义发布物名称,可更改
mavenJava(MavenPublication) {
// 关键配置:使用 Java 组件自动生成依赖等信息
from components.java
}
}
}
# 生成 POM 文件 gradle generatePomFileForMavenJavaPublication
理生成的文件
生成的 POM 文件位于模块的 build 目录下:
-
定位生成的文件:
build/publications/mavenJava/pom-default.xml -
复制到模块根目录并重命名为
pom.xml
最终使用
将生成的 pom-default.xml 文件复制到模块的根目录,并重命名为 pom.xml,即可作为该模块的 Maven 构建基础。
多模块项目转换
项目结构示例
## 工程结构 [端口可根据实际情况做调整] ```lua cow-admin -- 项目根目录 ├── auth-server -- 认证中心服务[8083] ├── common -- 公共基础库 ├ ├── bi -- bi ├ ├── db -- db ├ ├── domain -- 领域模型 ├ ├── locale -- locale ├ ├── message -- message ├ └── meta -- meta 枚举元数据 ├ └── netty -- netty ├ └── rsync -- rsync ├ └── security -- security ├ └── table -- table ├── gateway -- 网关服务[7778] ├── gms-ranch -- gms-ranch[8091] ├── module -- 模块库 ├ └── contract -- contract 合约 ├ └── logic -- logic ├ └── model-ranch -- model-ranch ├── task-ranch -- task-ranch ├ └── task-ranch-base -- task-ranch-base ├ └── task-ranch-bullring -- task-ranch-bullring ├ └── task-ranch-retention -- task-ranch-retention ├ └── task-ranch-runner -- task-ranch-runner ├ └── task-ranch-user -- task-ranch-user ├── task-runner -- task-runner[8081] ```
在根项目的 build.gradle 中:
// 在根项目的 build.gradle 中
allprojects {
group = "com.brilljoy" // 统一 GroupId
version = "1.0.0-SNAPSHOT" // 统一版本号
}
Gradle 会自动从 project.group、project.name (对应 ArtifactId)、project.version 获取坐标信息并写入 POM。
子模块最小配置
在每个子模块的 build.gradle
plugins {
id 'java' // 必需
id 'maven-publish' // 必需
}
publishing {
publications {
mavenJava(MavenPublication) {
from components.java
}
}
}
这样就告诉 Gradle:要用 Java 组件生成一个
pom。
# 方式一:执行所有模块的发布任务(推荐) ./gradlew generatePomFileForMavenJavaPublication # 方式二:分别指定模块生成 ./gradlew :common:generatePomFileForMavenJavaPublication ./gradlew :common:bi:generatePomFileForMavenJavaPublication ./gradlew :gateway:generatePomFileForMavenJavaPublication # ... 其他模块
完整配置示例
plugins {
id 'java'
id "maven-publish"
id 'org.springframework.boot' version '2.5.3' apply false
id 'io.spring.dependency-management' version '1.0.11.RELEASE' apply false
id 'idea' // 修正:用id语法声明idea插件,替代apply plugin
}
description = "cow-admin 创奇牧场"
// 加载全局配置
apply from: rootProject.file("config.gradle")
group 'com.brilljoy.olap'
version = revision
//sourceCompatibility = '11'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
ext {
set('springCloudVersion', "2020.0.5")
set("springBootVersion", "2.5.9")
set("commonsVersion", "1.15")
}
// 所有项目(主项目+子项目)配置
allprojects {
// 指定需要的插件
// 指定语言
apply plugin: 'java'
tasks.withType(JavaCompile) {
options.release = 11 // 关键:指定编译为 Java 11 字节码(Gradle 7+ 支持)
options.encoding = 'UTF-8'
}
// 配置项目信息(继承主项目)
group group
version version
// 指定编码格式
[compileJava, compileTestJava, javadoc]*.options*.encoding = 'UTF-8'
// 配置仓库
repositories {
//优先从本地仓库获取
mavenLocal()
//阿里
maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
//腾讯
maven { url 'https://mirrors.cloud.tencent.com/nexus/repository/maven-public/' }
//华为
maven { url 'https://mirrors.huaweicloud.com/kunpeng/maven/' }
mavenCentral()
gradlePluginPortal()
}
buildscript {
repositories {
maven { name "Alibaba"; url 'https://maven.aliyun.com/nexus/content/groups/public' }
maven { name "tencent"; url 'https://mirrors.cloud.tencent.com/nexus/repository/maven-public/' }
maven { name "goolge"; url 'https://maven.aliyun.com/nexus/content/repositories/google' }
}
}
}
// 子项目配置
subprojects {
apply plugin: 'java'
apply plugin: 'java-library'
apply plugin: 'maven-publish'
apply plugin: 'idea' /* 同上 让Gradle自动生成Intellij的项目文件*/
// apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
// 配置全局依赖版本信息
ext {
// 统一定义版本,后面引用
compileJava.options.encoding = 'UTF-8'
compileTestJava.options.encoding = 'UTF-8'
// springVersion = "2.3.12.RELEASE"
commonVersion = "1.0.15-SNAPSHOT"
moduleVersion = "1.0.14-SNAPSHOT"
easyexcelVersion = "3.1.1"
}
// 配置字符编码
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
// dependencyManagement版本统一管理,类似于父maven的dependencyManagement
dependencyManagement {
dependencies {
for(depJar in rootProject.ext.dependencies){
dependency depJar.value
}
dependency("commons-codec:commons-codec:${commonsVersion}")
dependency("org.springframework.boot:spring-boot-starter:${springBootVersion}")
dependency("org.springframework.boot:spring-boot-starter-undertow:${springBootVersion}")
// dependency("org.springframework.data:spring-data-commons:${springDataVersion}")
// dependency("org.springframework.boot:spring-boot-starter-jdbc:${rootProject.ext.springBootVersion}")
dependency "com.mysql:mysql-connector-j:8.2.0"
}
imports {
// 关键:导入 Spring Boot 官方 BOM,替代手动声明单个 Starter 版本
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
mavenBom "org.springframework.boot:spring-boot-dependencies:${springBootVersion}"
}
}
// 子项目依赖,类似于在父maven的dependencies
dependencies {
// 统一声明 spring-boot-starter-test 为测试依赖
testImplementation 'org.springframework.boot:spring-boot-starter-test'
// implementation(enforcedPlatform(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES))
// lombok
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
}
// 开启构建bootJar
// tasks.bootJar {
// enabled = true
// }
tasks.named('test') {
useJUnitPlatform()
}
// 关键:统一配置 Maven 发布逻辑(所有模块共用)
publishing {
publications {
// 定义发布名称为 mavenJava(与 common 子模块保持一致)
mavenJava(MavenPublication) {
// 分两种情况:普通模块(common 子模块)和 Spring Boot 服务模块
if (plugins.hasPlugin('org.springframework.boot')) {
// 情况 1:Spring Boot 服务模块(auth-server、gateway 等)
// 关联 bootJar 生成的可执行 JAR(避免默认 components.java 失效)
artifact tasks.bootJar
} else {
// 情况 2:普通 Java 模块(common 子模块)
// 关联 java 组件生成的普通 JAR
from components.java
}
// 补充 POM 元数据(可选,但建议统一配置,避免 pom 缺失关键信息)
pom {
name = project.name // 模块名称
description = "cow-admin 项目的 ${project.name} 模块" // 模块描述
url = "https://gitee.com/li_VillageHead/cow-admin.git" // 可选
// (可选)许可证、开发者信息等,按需求添加
licenses {
license {
name = "Apache License 2.0"
url = "https://www.apache.org/licenses/LICENSE-2.0.txt"
}
}
}
}
}
// 统一配置发布仓库(本地 Maven 仓库)
repositories {
mavenLocal()
}
}
// 强制发布前先执行构建(确保 JAR 已生成)
tasks.publishToMavenLocal.dependsOn tasks.build
}
添加完上面这段之后,执行下面的命令即可生成 pom 文件:
gradle generatePomFileForMyMavenPublication
执行生成
# 清理并生成所有模块的 POM ./gradlew clean ./gradlew publishToMavenLocal
处理生成的 POM
-
收集生成的文件:
-
各模块的
build/publications/mavenJava/pom-default.xml -
复制到对应模块根目录并重命名为
pom.xml
-
-
创建父 POM:
-
在根目录创建
pom.xml -
定义模块聚合 (
<modules>) -
定义依赖管理 (
<dependencyManagement>)
-
-
调整子模块 POM:
-
移除重复的依赖管理配置
-
添加父模块引用 (
<parent>) -
调整依赖作用域
-
示例生成的 POM 内容
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- This module was also published with a richer model, Gradle metadata, -->
<!-- which should be used instead. Do not delete the following line which -->
<!-- is to indicate to Gradle or any Gradle module metadata file consumer -->
<!-- that they should prefer consuming it instead. -->
<!-- do_not_remove: published-with-gradle-metadata -->
<modelVersion>4.0.0</modelVersion>
<groupId>com.brilljoy.common</groupId>
<artifactId>bi</artifactId>
<version>1.0.15-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.1</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>jakarta.persistence</groupId>
<artifactId>jakarta.persistence-api</artifactId>
<version>2.2.3</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.12.4</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
<scope>runtime</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2020.0.5</version>
<scope>import</scope>
<type>pom</type>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>2.5.9</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies-parent</artifactId>
<version>2020.0.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.5.9</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.5.9</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
<version>2.5.8</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
注意: 此方法主要辅助生成模块依赖列表,但对于 Maven 项目的聚合与继承结构,仍需开发者根据 Maven 的最佳实践进行手动设计和调整。
Gradle 项目

转换完成Maven

-
依赖作用域不匹配:
-
检查 Gradle 的
implementation/api与 Maven 的compile/runtime对应关系
-
-
模块间依赖问题:
-
确保子模块间依赖使用 Maven 坐标而非项目路径
-
-
插件配置缺失:
-
Maven 需要显式配置插件,而 Gradle 很多功能是内置的
-
迁移策略
7.1 渐进式迁移
-
阶段一:双构建系统并存
-
阶段二:逐步迁移构建逻辑
-
阶段三:完全切换到 Maven
7.2 回滚方案
-
保留原始的 Gradle 配置
-
使用版本控制系统管理迁移过程
-
准备回滚脚本和文档
八、最佳实践
-
保持简洁:尽量使用标准的 Maven 约定,减少自定义配置
-
统一管理:在父 POM 中集中管理依赖版本和插件配置
-
逐步验证:分模块逐步验证,避免一次性大规模迁移
-
文档化:记录所有自定义配置和特殊处理
总结
Gradle 到 Maven 的转换是一个系统工程,自动化工具可以处理依赖关系等基础工作,但项目结构和构建逻辑需要根据 Maven 的最佳实践进行手动设计和调整。建议采用渐进式迁移策略,确保过程的平稳和可控性。
注意: 本文档提供的示例和代码需要根据实际项目情况进行调整。建议在正式迁移前在测试环境中充分验证。
浙公网安备 33010602011771号