将Gradle的build.gradle转换为Maven的pom.xml

77

我有一个Gradle项目,需要将其所有依赖项传输并与另一个Maven项目一起使用。换句话说,我该如何从build.gradle生成pom.xml(或者我能否生成)?

5个回答

94
自 Gradle 7 开始,当使用 Gradle 的 Maven-Publish 插件 时,publishToMavenLocalpublish 将自动添加到您的任务中,并调用任一一个将始终生成 POM 文件。
因此,如果您的 build.gradle 文件如下所示:
plugins {
    id 'java'
    id 'maven-publish'
}

repositories {
    mavenCentral()
}

dependencies {
    implementation group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25'
    runtimeOnly group: 'ch.qos.logback', name:'logback-classic', version:'1.2.3'
    testImplementation group: 'junit', name: 'junit', version: '4.12'
}

// the GAV of the generated POM can be set here
publishing {
    publications {
        maven(MavenPublication) {
            groupId = 'edu.bbte.gradleex.mavenplugin'
            artifactId = 'gradleex-mavenplugin'
            version = '1.0.0-SNAPSHOT'

            from components.java
        }
    }
}

您可以在其文件夹中调用gradle publishToLocalRepo,然后您将在build/publications/maven子文件夹中找到一个名为pom-default.xml的文件。此外,构建的JAR与POM将在您的Maven本地存储库中。更确切地说,如果要省略发布到您的Maven本地存储库,则gradle generatePomFileForMavenPublication任务执行实际生成。
请注意,并非所有依赖项都显示在此处,因为Gradle“配置”并不总是与Maven“范围”一一对应。

这应该是生成POM并在本地安装构件的“官方”方式,特别是当您正在转换一堆基于遗留POM的模块项目时。 - Jerry Tian
4
看起来这段代码已经在网络上被广泛复制了,我想知道最初的作者是谁。https://dzone.com/articles/how-to-convert-maven-to-gradle-and-vice-versa - Dalibor Filus
1
从Gradle 7.x开始,maven插件已被移除。应改用maven-publish插件。 - pirateofebay
1
@pirateofebay 没错,谢谢。已经调整了答案以反映新的语法。 - csaba.sulyok
生成的pom.xml文件有点问题:没有指定Java版本,也没有指定编码。 - Eric Duminil

25

我不想在本地存储库中安装任何东西,所以在阅读文档后,我做了以下操作。将以下内容添加到您的build.gradle文件中。

apply plugin: 'maven'

group = 'com.company.root'
// artifactId is taken by default, from folder name
version = '0.0.1-SNAPSHOT'

task writeNewPom << {
    pom {
        project {
            inceptionYear '2014'
            licenses {
                license {
                    name 'The Apache Software License, Version 2.0'
                    url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                    distribution 'repo'
                }
            }
        }
    }.writeTo("pom.xml")
}

运行以下命令:gradle writeNewPom

@a_horse_with_no_name

由于Gradle使用Groovy编写,可以尝试在“}”项目块结束后添加 after 块。

build{
  plugins{
    plugin{
      groupId 'org.apache.maven.plugins'
      artifactId 'maven-compiler-plugin'
      configuration{
          source '1.8'
          target '1.8'
      }
    }
  }
}

没有尝试,猜测而已!


2
这只是将JAR文件写入POM,但不创建一个完整的项目,该项目还包括来自项目的源代码。如何让Maven插件也将源代码(和文本、资源等)目录写入POM? - user330315
如果出现“找不到leftShift()方法”的错误,请将<<运算符替换为doLast,然后再尝试。可使用我在这里找到的类似方法 - Brad Parks
不再支持:pom()方法是由传统的Maven插件提供的。由于该插件已在Gradle 7中被删除,因此该方法不再可用。 Maven插件已被maven-publish插件替换,但它没有为pom()提供可比较的替代方案。 maven-publish插件会根据配置的发布自动创建pom生成任务。 https://docs.gradle.org/current/userguide/publishing_maven.html#publishing_maven:tasks 7 - Luiz Rossi

20

当你没有安装Gradle时,“编写Gradle任务完成此操作”并不是很有用。我制作了过滤器,将Gradle依赖项转换为Maven依赖项,而不是安装带有依赖项的100MB怪物:

cat build.gradle\
| awk '{$1=$1};1'\
| grep -i "compile "\
| sed -e "s/^compile //Ig" -e "s/^testCompile //Ig"\
| sed -e "s/\/\/.*//g"\
| sed -e "s/files(.*//g"\
| grep -v ^$\
| tr -d "'"\
| sed -e "s/\([-_[:alnum:]\.]*\):\([-_[:alnum:]\.]*\):\([-+_[:alnum:]\.]*\)/<dependency>\n\t<groupId>\1<\/groupId>\n\t<artifactId>\2<\/artifactId>\n\t<version>\3<\/version>\n<\/dependency>/g"

这将转换

compile 'org.slf4j:slf4j-api:1.7.+'
compile 'ch.qos.logback:logback-classic:1.1.+'
compile 'commons-cli:commons-cli:1.3'

进入

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.+</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.+</version>
</dependency>
<dependency>
    <groupId>commons-cli</groupId>
    <artifactId>commons-cli</artifactId>
    <version>1.3</version>
</dependency>

其余的pom.xml文件应该手动创建。


4
要将 gradle2maven 或 maven2gradle 依赖项转换,您可以使用此在线服务 https://sagioto.github.io/maven2gradle/。 - Yoandy Pérez Villazón
3
这段话的意思是:@YoandyPérezVillazón,这只是用于将Maven转换为Gradle,而不是相反地将Gradle转换为Maven。 - Eljah
2
@IlyaYevlampiev 抱歉,只能转换mvn到gradle! - Yoandy Pérez Villazón

15

我正在引用Maven插件,但没有archiveTask任务。 - Stealth Rabbi

0
将以下代码添加到您的build.gradle文件中。我将其粘贴到了我的末尾:
apply plugin: 'maven'
apply plugin: 'java'

task writeNewPom doLast {
    pom {
        project {
            groupId 'org.example'
            artifactId 'test'
            version '1.0.0'
        
            inceptionYear '2008'
            licenses {
                license {
                    name 'The Apache Software License, Version 2.0'
                    url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                    distribution 'repo'
                }
            }
        }
    }.writeTo("$buildDir/newpom.xml")
}

然后根据你拥有的内容运行以下代码。
$ gradle writeNewPom

或者

$ /.gradlew writeNewPom

文件已生成并放置在$buildDir/newpom.xml中 从这个gist中获取


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接