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.baeldungversion=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 和 POM
  • repositories 定义了一个本地目录作为目标仓库,便于验证结果

执行发布

运行命令:

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>

关键点:

  • groupIdartifactIdversion 自动从 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 文件
  • ✅ 自定义 groupIdartifactIdversion
  • ✅ 修正依赖 scope(从 runtime 改为 compile
  • ✅ 添加项目元数据(许可证、开发者、SCM 等)

📌 核心技巧是利用 pom.withXml 对生成的 XML 进行动态调整,灵活应对各种定制需求。

示例代码已上传至 GitHub:https://github.com/baeldung/gradle-to-maven

这种转换方式在实际项目迁移中非常实用,建议集合备用。


原始标题:Converting Gradle Build File to Maven POM