Contents

Gradle 构建文件转换为 Maven POM

1. 简介

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

2. Gradle 构建文件

让我们从一个标准的 Gradle Java 项目gradle-to-maven开始,使用以下build.gradle文件:

repositories {
    mavenCentral()
}
group = 'com.blogdemo'
version = '0.0.1-SNAPSHOT'
apply plugin: 'java'
dependencies {
    compile('org.slf4j:slf4j-api')
    testCompile('junit:junit')
}

3. Maven 插件

Gradle 附带一个Maven 插件 ,它增加了将 Gradle 文件转换为 Maven POM 文件的支持。它还可以将工件部署到 Maven 存储库。

要使用它,让我们将 Maven 插件添加到我们的build.gradle文件中:

apply plugin: 'maven'

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

该插件也会自动添加*install *任务。所以要转换,让我们运行以下命令:

gradle install

运行上述命令会创建一个包含三个子目录的*build *目录:

  • libs – 包含名称为 ${artifactId}-${version}.jar的 jar
  • poms – 包含转换后的 POM 文件,名称为pom-default.xml
  • tmp/jar – 包含清单

生成的 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.blogdemo</groupId>
  <artifactId>gradle-to-maven</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <dependencies>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

install任务还将生成的POM 文件和 JAR 上传到本地 Maven 存储库。

4. 自定义 Maven 插件

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

4.1. groupId、 artifactIdversion

更改groupIdartifactId和 POM 的version可以在install块中处理:

install {
    repositories {
        mavenInstaller {
            pom.version = '0.0.1-maven-SNAPSHOT'
            pom.groupId = 'com.blogdemo.sample'
            pom.artifactId = 'gradle-maven-converter'
        }
    }
}

运行install任务现在会生成带有上述信息的 POM 文件:

<groupId>com.blogdemo.sample</groupId>
<artifactId>gradle-maven-converter</artifactId>
<version>0.0.1-maven-SNAPSHOT</version>

4.2. POM 的目录和名称

有时,我们可能需要将 POM 文件复制到不同的目录并使用不同的名称。因此,让我们将以下内容添加到安装块中:

pom.writeTo("${mavenPomDir}/${project.group}/${project.name}/pom.xml")

mavenPomDir属性由插件公开,它将指向build/poms。我们还可以给出我们希望将 POM 文件复制到的任何目录的绝对路径。

运行install任务后,我们可以在build/poms/com.blogdemo/gradle-to-maven中看到pom.xml

4.3. 自动生成的内容

Maven 插件还可以直接更改任何生成的 POM 元素。例如,要使依赖项成为可选,我们可以在pom.whenConfigured 中添加以下闭包:

pom.whenConfigured { pom ->
    pom.dependencies.find {dep -> dep.groupId == 'junit' && dep.artifactId == 'junit' }.optional = true
}

这将产生添加到dependencyoptional属性:

<dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <scope>test</scope>
      <optional>true</optional>
</dependency>

4.4. 附加信息

最后,如果我们想添加额外的信息,我们可以在pom.project构建器中包含任何 Maven 支持的元素。

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

pom.project {
    inceptionYear '2020'
    licenses {
        license {
            name 'My License'
            url 'http://www.mycompany.com/licenses/license.txt'
            distribution 'repo'
        }
    }
}

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

<inceptionYear>2020</inceptionYear>
<licenses>
    <license>
      <name>My License</name>
      <url>http://www.mycompany.com/licenses/license.txt</url>
      <distribution>repo</distribution>
    </license>
</licenses>