将Gradle构建文件转换为Maven POM

2025/04/30

1. 简介

在本教程中,我们将了解如何将Gradle构建文件转换为Maven POM文件,我们将使用Gradle 7.2版本作为示例,并探索一些可用的自定义选项。

2. Gradle构建文件

让我们从标准Gradle Java项目gradle-to-maven开始,其中包含以下build.gradle文件:

repositories {
    mavenCentral()
}

group = ''
version = '0.0.1'

apply plugin: 'java'

dependencies {
    implementation 'org.slf4j:slf4j-api:1.7.25'
    testImplementation 'junit:junit:4.12'
}

3. Maven插件

Gradle附带一个Maven插件,该插件支持将Gradle文件转换为Maven POM文件,它还可以将工件部署到Maven仓库。

要使用此功能,我们将Maven Publish插件添加到我们的build.gradle文件中:

apply plugin: 'maven-publish'

该插件使用Gradle文件中的组和版本,并将它们添加到POM文件中。此外,它还会自动从目录名称中获取artifactId。

该插件还会自动添加发布任务,为了进行转换,我们需要在POM文件中添加一个发布任务的基本定义:

publishing {
    publications {
        customLibrary(MavenPublication) {
            from components.java
        }
    }

    repositories {
        maven {
            name = 'sampleRepo'
            url = layout.buildDirectory.dir("repo")
        }
    }
}

现在我们可以将customLibrary发布到基于本地目录的仓库以用于演示目的:

gradle publish

运行上述命令将创建一个包含以下子目录的构建目录:

  • libs:包含名为${artifactId}-${version}.jar的jar
  • publications/customLibrary:包含已转换的POM文件,文件名为pom-default.xml
  • tmp/jar:包含清单
  • repo:用作包含已发布工件的仓库的文件系统位置

生成的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>cn.tuyucheng.taketoday</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>

请注意,test范围依赖未包含在POM中,并且默认runtime范围分配给所有其他依赖

发布任务还将此POM文件和JAR上传到指定的仓库。

4. 自定义Maven插件

在某些情况下,自定义生成的POM文件中的项目信息可能会很有用,我们来看一下。

4.1 groupId、artifactId和version

可以在publications/{publicationName}块中处理groupId、artifactId和POM版本的更改:

publishing {
    publications {
        customLibrary(MavenPublishing) {
            groupId = '.sample'
            artifactId = 'gradle-maven-converter'
            version = '0.0.1-maven'
        }
    }
}

运行发布任务现在会生成包含上面提供的信息的POM文件:

<groupId>cn.tuyucheng.taketoday.sample</groupId>
<artifactId>gradle-maven-converter</artifactId>
<version>0.0.1-maven</version>

4.2 自动生成内容

Maven插件还可以轻松更改任何生成的POM元素,例如,要将默认运行时范围更改为compile,我们可以将以下闭包添加到pom.withXml方法中:

pom.withXml {
    asNode()
        .dependencies
        .dependency
        .findAll { dependency ->
            // find all dependencies with runtime scope
            dependency.scope.text() == 'runtime'
        }
        .each { dependency ->
            // set the scope to 'compile'
            dependency.scope*.value = 'compile'
        }
}

这将改变生成的POM文件中所有依赖的范围:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>
    <scope>compile</scope>
</dependency>

4.3 附加信息

最后,如果我们想添加额外的信息,我们可以将这些Maven支持的元素包含到pom函数中

让我们添加一些许可证信息:

...
pom {
    licenses {
        license {
            name = 'The Apache License, Version 2.0'
            url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
        }
    }
}
...

我们现在可以看到添加到POM的许可证信息:

... 
<licenses>
    <license>
        <name>The Apache License, Version 2.0</name>
        <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
    </license>
</licenses>
...

5. 总结

在本快速教程中,我们学习了如何将Gradle构建文件转换为Maven POM。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章