1. 简介
在本文中,我们将演示如何将 Gradle 的构建文件(build.gradle
)转换为 Maven 的 POM 文件(pom.xml
)。示例基于 Gradle 7.2 版本,并会介绍几种常用的自定义方式。
这种转换在项目迁移、统一构建规范或与 Maven 生态工具集成时非常实用。✅
2. Gradle 构建文件示例
我们以一个标准的 Gradle Java 项目 gradle-to-maven
为例,其 build.gradle
内容如下:
repositories {
mavenCentral()
}
group = 'com.baeldung'
version = '0.0.1'
apply plugin: 'java'
dependencies {
implementation 'org.slf4j:slf4j-api:1.7.25'
testImplementation 'junit:junit:4.12'
}
这个配置定义了:
- 使用 Maven 中央仓库
- 项目坐标:
groupId=com.baeldung
,version=0.0.1
- 应用 Java 插件
- 引入 SLF4J API 作为主依赖,JUnit 作为测试依赖
⚠️ 注意:testImplementation
是测试范围依赖,不会被包含在最终生成的 POM 中。
3. 使用 Maven Publish 插件生成 POM
Gradle 提供了 Maven Publish 插件,可以将项目发布到 Maven 仓库,并生成标准的 pom.xml
文件。
添加插件
首先,在 build.gradle
中应用插件:
apply plugin: 'maven-publish'
配置发布任务
接着添加 publishing
块来定义发布内容:
publishing {
publications {
customLibrary(MavenPublication) {
from components.java
}
}
repositories {
maven {
name = 'sampleRepo'
url = layout.buildDirectory.dir("repo")
}
}
}
说明:
customLibrary
是发布的名称,类型为MavenPublication
from components.java
表示从 Java 组件生成 JAR 和 POMrepositories
定义了一个本地目录作为目标仓库,便于验证结果
执行发布
运行命令:
gradle publish
执行后会生成 build
目录,结构如下:
build/
├── libs/
│ └── gradle-to-maven-0.0.1.jar
├── publications/
│ └── customLibrary/
│ └── pom-default.xml
├── repo/
│ └── com/baeldung/gradle-to-maven/0.0.1/
├── tmp/jar/
其中 pom-default.xml
就是我们需要的 POM 文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>com.baeldung</groupId>
<artifactId>gradle-to-maven</artifactId>
<version>0.0.1</version>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</project>
关键点:
- ✅
groupId
、artifactId
、version
自动从 Gradle 配置中提取 - ❌ 测试依赖(如 JUnit)不会出现在 POM 中
- ⚠️ 所有
implementation
依赖默认映射为<scope>runtime</scope>
,这可能不符合预期(通常应为compile
)
4. 自定义生成的 POM 文件
默认生成的 POM 往往不够用,我们可以通过配置进一步定制。
4.1 修改 groupId、artifactId 和 version
可以在 publications
块中显式指定:
publishing {
publications {
customLibrary(MavenPublication) {
groupId = 'com.baeldung.sample'
artifactId = 'gradle-maven-converter'
version = '0.0.1-maven'
from components.java
}
}
}
生成的 POM 对应部分变为:
<groupId>com.baeldung.sample</groupId>
<artifactId>gradle-maven-converter</artifactId>
<version>0.0.1-maven</version>
简单粗暴,直接覆盖,适合迁移场景。
4.2 修改依赖范围(Scope)
默认 implementation
映射为 runtime
,但大多数情况下我们希望是 compile
。可以通过 pom.withXml
拦截并修改 XML 节点:
publishing {
publications {
customLibrary(MavenPublication) {
from components.java
pom.withXml {
asNode()
.dependencies
.dependency
.findAll { dependency ->
dependency.scope.text() == 'runtime'
}
.each { dependency ->
dependency.scope*.value = 'compile'
}
}
}
}
}
效果:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
<scope>compile</scope>
</dependency>
✅ 这是处理 scope 映射问题的标准做法,踩坑必备。
4.3 添加额外元信息
POM 支持丰富的项目信息,比如许可证、开发者、SCM 等。我们可以在 pom
块中添加:
publishing {
publications {
customLibrary(MavenPublication) {
from components.java
pom {
name = 'Gradle to Maven Converter'
description = 'A sample project demonstrating Gradle to Maven POM conversion'
url = 'https://github.com/baeldung/gradle-to-maven'
licenses {
license {
name = 'The Apache License, Version 2.0'
url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
}
}
developers {
developer {
id = 'john.doe'
name = 'John Doe'
email = 'john.doe@baeldung.com'
}
}
scm {
connection = 'scm:git:git://github.com/baeldung/gradle-to-maven.git'
developerConnection = 'scm:git:ssh://github.com/baeldung/gradle-to-maven.git'
url = 'https://github.com/baeldung/gradle-to-maven'
}
}
}
}
}
生成的 POM 会包含这些信息:
...
<name>Gradle to Maven Converter</name>
<description>A sample project demonstrating Gradle to Maven POM conversion</description>
<url>https://github.com/baeldung/gradle-to-maven</url>
<licenses>
<license>
<name>The Apache License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
<developers>
<developer>
<id>john.doe</id>
<name>John Doe</name>
<email>john.doe@baeldung.com</email>
</developer>
</developers>
<scm>
<connection>scm:git:git://github.com/baeldung/gradle-to-maven.git</connection>
<developerConnection>scm:git:ssh://github.com/baeldung/gradle-to-maven.git</developerConnection>
<url>https://github.com/baeldung/gradle-to-maven</url>
</scm>
...
这些信息对于开源项目或企业内部构件管理非常重要。✅
5. 总结
通过本文,我们掌握了如何使用 Gradle 的 Maven Publish 插件将 build.gradle
转换为标准的 pom.xml
,并实现了以下能力:
- ✅ 自动生成基础 POM 文件
- ✅ 自定义
groupId
、artifactId
、version
- ✅ 修正依赖 scope(从
runtime
改为compile
) - ✅ 添加项目元数据(许可证、开发者、SCM 等)
📌 核心技巧是利用 pom.withXml
对生成的 XML 进行动态调整,灵活应对各种定制需求。
示例代码已上传至 GitHub:https://github.com/baeldung/gradle-to-maven
这种转换方式在实际项目迁移中非常实用,建议集合备用。