基于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
相关产品推荐
相关产品推荐

