Gradle 转 Maven POM
1. 简介
在本教程中,我们将研究如何将 Gradle 构建文件转换为 Maven POM 文件,并探讨一些可用的自定义选项。
2. Gradle 构建文件
让我们从一个标准的 Gradle Java 项目开始。该项目具备以下的 build.gradle 文件:
repositories {
mavenCentral()
}
group = 'com.daicy'
version = '0.0.1-SNAPSHOT'
apply plugin: 'java'
dependencies {
compile('org.slf4j:slf4j-api')
testCompile('junit:junit')
}3. Maven 插件
Gradle 附带了 Maven 插件,该插件增加了将 Gradle 文件转换为 Maven POM 文件的支持,同时也支持将工件(Artifact)部署到 Maven 仓库。
要使用此功能,我们需要将 Maven 插件添加到 build.gradle 文件中:
apply plugin: 'maven'该插件会使用 Gradle 文件中定义的 group 和 version,并将它们添加到生成的 POM 文件中。同样,它会自动从目录名称中获取 artifactId。
该插件还会自动添加 install 任务。因此,要进行转换,请运行以下命令:
gradle install运行上面的命令将创建一个包含三个子目录的 build 目录:
- libs – 包含名称为
${artifactId}-${version}.jar的 JAR 文件 - poms – 包含名称为
pom-default.xml的转换后的 POM 文件 - 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.daicy</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, artifactId 和 version
更改 POM 的 groupId、artifactId 和 version 可以在 install 块中处理:
install {
repositories {
mavenInstaller {
pom.version = '0.0.1-maven-SNAPSHOT'
pom.groupId = 'com.daicy.sample'
pom.artifactId = 'gradle-maven-converter'
}
}
}现在,运行 install 任务将生成具有以上信息的 POM 文件:
<groupId>com.daicy.sample</groupId>
<artifactId>gradle-maven-converter</artifactId>
<version>0.0.1-maven-SNAPSHOT</version>4.2. POM 的目录和名称
有时,我们可能需要将 POM 文件复制到其他目录并使用不同的名称。因此,让我们在 install 块中添加以下内容:
pom.writeTo("${mavenPomDir}/${project.group}/${project.name}/pom.xml")该插件公开了 mavenPomDir 属性,该属性默认指向 build/poms。我们还可以提供要将 POM 文件复制到的任何目录的绝对路径。
运行 install 任务后,我们可以在 build/poms/com.daicy/gradle-to-maven 中看到 pom.xml。
4.3. 自动生成的内容
Maven 插件还使您可以直接更改任何生成的 POM 元素。例如,要使依赖项为可选(optional),我们可以将以下闭包添加到 pom.whenConfigured 中:
pom.whenConfigured { pom ->
pom.dependencies.find {dep -> dep.groupId == 'junit' && dep.artifactId == 'junit' }.optional = true
}这将产生添加到依赖项的 optional 属性:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
<optional>true</optional>
</dependency>4.4. 附加信息
最后,如果要添加其他信息,可以将任何 Maven 支持的元素包括到 pom.project 构建器中。
让我们添加一些许可证信息:
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>5. 结论
在本快速教程中,我们学习了如何将 Gradle 构建文件转换为 Maven POM。
与往常一样,本文的源代码可以在 GitHub 上找到。
说明:本文基于 Gradle 旧版 Maven 插件(apply plugin: 'maven')编写。该插件在 Gradle 3.0 中已弃用,并在 Gradle 7.0 中被移除。如果您使用的是较新版本的 Gradle,建议查阅maven-publish插件的相关文档。
版权声明:本文为原创文章,版权归 戴老师的博客 所有,转载请联系博主获得授权。
本文地址:https://1diff.fun/archives/gradle-zhuan-maven-pom.html
如果对本文有什么问题或疑问都可以在评论区留言,我看到后会尽量解答。