You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Kotlin DSL生成含项目/子项目全依赖的pom.xml文件时遇MavenPluginConvention引用问题求助

解决Gradle KTS中找不到MavenPluginConvention的问题,生成包含所有子项目依赖的pom.xml

嘿,这个问题我之前也踩过坑!你碰到的MavenPluginConvention找不到的情况,是因为Gradle 7.x版本之后,这个旧的Groovy风格API已经被废弃并移除了,取而代之的是更现代化的maven-publish插件API,尤其是在Kotlin DSL(.kts)里,写法和原来的Groovy版差异不小。

下面给你两种场景的解决方案,分别对应单个项目和包含子项目的情况,都能自动把你的Gradle implementation等依赖转换成Maven pom.xml格式:

1. 单个项目生成pom.xml

直接替换你原来的代码,使用maven-publish插件来配置:

plugins {
    java
    `maven-publish` // 用这个替代旧的maven插件
}

tasks.register("createPom") {
    group = "maven"
    description = "Generates a Maven pom.xml file based on the build.gradle.kts file"
    doLast {
        // 创建Maven发布配置,自动关联Java组件的依赖
        val mavenPub = publishing.publications.create<MavenPublication>("maven") {
            from(components["java"])
            pom {
                groupId = "my.group"
                artifactId = "my-app"
                version = "latest"
                // 替代原来的withGroovyBuilder写法,直接用Kotlin的属性设置
                inceptionYear.set("2042")
            }
        }
        // 把生成的pom写入文件
        mavenPub.pom.writeTo(file("pom.xml"))
    }
}

运行./gradlew createPom就能在项目根目录得到包含所有依赖的pom.xml了,Gradle会自动把implementation、testImplementation等依赖映射成Maven对应的compile、test scope。

2. 为所有子项目生成pom(或聚合pom)

如果要处理包含子项目的多模块项目,分两种需求:

需求A:每个子项目单独生成自己的pom.xml

在根项目的build.gradle.kts里配置:

subprojects {
    apply {
        plugin("java")
        plugin("maven-publish")
    }

    tasks.register("createPom") {
        group = "maven"
        description = "Generates Maven pom.xml for this subproject"
        doLast {
            val mavenPub = publishing.publications.create<MavenPublication>("maven") {
                from(components["java"])
                pom {
                    groupId = "my.group"
                    artifactId = project.name // 用子项目名称作为artifactId
                    version = "latest"
                    inceptionYear.set("2042")
                }
            }
            // 把每个子项目的pom单独存放在根目录,命名为[子项目名]-pom.xml
            mavenPub.pom.writeTo(file("${rootProject.rootDir}/${project.name}-pom.xml"))
        }
    }
}

运行./gradlew subprojects:createPom就能批量生成所有子项目的pom文件。

需求B:生成包含所有子项目的聚合pom(父pom)

如果需要一个根聚合pom,把所有子项目作为modules包含进去:

plugins {
    java
    `maven-publish`
}

// 确保所有子项目都应用必要的插件
allprojects {
    apply {
        plugin("java")
        plugin("maven-publish")
    }
}

tasks.register("createAggregatePom") {
    group = "maven"
    description = "Generates an aggregate pom.xml including all subprojects"
    doLast {
        publishing.publications.create<MavenPublication>("aggregate") {
            pom {
                groupId = "my.group"
                artifactId = "my-app-parent"
                version = "latest"
                inceptionYear.set("2042")
                // 添加所有子项目作为modules
                modules {
                    subprojects.forEach { subproj ->
                        module(subproj.name)
                    }
                }
            }
        }.pom.writeTo(file("aggregate-pom.xml"))
    }
}

运行./gradlew createAggregatePom就能得到聚合pom,适合作为多模块项目的父pom使用。

关键注意点

  • 一定要用maven-publish插件替代旧的maven插件,旧插件的API已经被Gradle官方标记为废弃,不再更新维护。
  • 不需要手动转换依赖:maven-publish会自动处理Gradle依赖配置到Maven scope的映射,比如implementation对应compile,testImplementation对应test,比手动写更准确。

内容的提问来源于stack exchange,提问作者user3354265

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 21:13:12