
我们知道,如果同一个版本发布两次
那么第二次会报错,大概意思是 maven 私服同一个版本只能发布一次,不能覆盖
或许可以设置强行覆盖,即使支持版本覆盖一般也不会这么干
问题
为什么我点击一次 publish
同一个版本上传了两次(发布了两次)
分析
有问题:会发布两次的配置
build.gradle.kts
kts
plugins {
alias(libs.plugins.jetbrains.kotlin.jvm)
//插件开发
id("java-gradle-plugin")
//maven 发布
id("maven-publish")
}
val checkArtifactId = project.properties["ARTIFACT_ID"] as String
val checkGroupId = project.properties["GROUP_ID"] as String
var checkVersion = project.properties["VERSION"] as String
//指定插件 ID 和入口
gradlePlugin {
plugins {
create("Check") {
//1、同 agp7+ 应用插件的 ID,apply plugin: 'com.primer.plugin'
//2、会再发布一个 id + gradle.plugin 的 pom
id = checkGroupId
group = checkGroupId
version = checkVersion
implementationClass = "com.primer.plugin.Check"
}
}
}
//插件发布
publishing {
publications {
create<MavenPublication>("maven") {
from(components["kotlin"])
groupId = checkGroupId
version = checkVersion
artifactId = checkArtifactId
}
}
repositories {
maven {
isAllowInsecureProtocol = true
credentials {
username = "123456"
password = "123456"
}
url = uri("http://maven 私服地址")
}
}
}
点击一次 publishToMavenLocal
,以下是按顺序执行的 Task
这一看可能不知道这些任务是做什么的,输出产物是什么?
那我们就挨个任务点击运行,看看关键任务输出的产物是什么
c
publishToMavenLocal
:check:generatePomFileForCheckPluginMarkerMavenPublication
//生成插件的 pom【com.primer.plugin.gradle.plugin-1.0.0.123.pom】
//需要注意的是生成带有 gradle.plugin 的 pom,在以前 AGP7+ 没见过,可能是 AGP8+ 新引入的
:check:publishCheckPluginMarkerMavenPublicationToMavenLocal
:check:checkKotlinGradlePluginConfigurationErrors
:check:extractPluginRequests
:check:generatePluginAdapters
:check:compileKotlin
:check:compileJava
:check:compileGroovy
:check:compileGroovyPlugins
:check:pluginDescriptors
:check:processResources
:check:classes
:check:jar
:check:generateMetadataFileForMavenJavaPublication
:check:generatePomFileForMavenJavaPublication
//生成 com.primer.plugin.check JAR,插件所有的代码打包成 jar
:check:publishMavenJavaPublicationToMavenLocal【1】
:check:generateMetadataFileForPluginMavenPublication
:check:generatePomFileForPluginMavenPublication
//生成 com.vimedia.plugin.check JAR,插件所有的代码打包成 jar
//😮问题暴露了,这里第二次生成 jar,导致了 maven 发布报错问题
:check:publishPluginMavenPublicationToMavenLocal【2】
:check:publishToMavenLocal
所以问题出现了:
为什么有两个任务都发布 jar
?
这两个到底是什么?
能不能去掉其中一个?
- publishMavenJavaPublicationToMavenLocal
- publishPluginMavenPublicationToMavenLocal
后来对比 AGP7+ 的 maven 发布 build.gradle
配置,主要存在以下两个区别:
- 在 AGP8+ 开发中
build.gradle.kts
引入了新的插件id("java-gradle-plugin")
(以前在 AGP7+ 的插件开发中是没有引入这种插件的) - 插件创建的方式不同
AGP7+ 创建插件
1、创建 resource 目录,新建 META-INF.gradle-plugins
2、目录下新建 com.primer.plugin.properties 插件 Id 文件(com.primer.plugin 这部分就是插件引用是的插件 Id)
3、文件内配置插件入口类 implementation-class

AGP8+ 创建插件
kts
val checkGroupId = project.properties["GROUP_ID"] as String
var checkVersion = project.properties["VERSION"] as String
gradlePlugin {
plugins {
create("Check") {
//1、同 agp7+ 应用插件的 ID,apply plugin: 'com.primer.plugin'
//2、会再发布一个 id + gradle.plugin 的 pom
//3、artifactId = project.archivesBaseName (如果未设置,则默认为 project.name)
id = checkGroupId //插件 Id,com.primer.plugin
group = checkGroupId
version = checkVersion
//artifactId = project.archivesBaseName (如果未设置,则默认为 project.name)
//artifactId = checkArtifactId
implementationClass = "com.primer.plugin.Check" //插件入口类
}
}
}
正是两种不同的插件创建方式导致了这次问题的发生
警告不断的调试,当我注释掉 build.gradle.kts
中的 publishing
-> publications
部分
上述的两个生成 jar 的任务只剩下其中一个了,问题应该解决了

解决
所以最终的插件发布配置是这样的
build.gradle.kts
kts
plugins {
alias(libs.plugins.jetbrains.kotlin.jvm)
//插件开发
id("java-gradle-plugin")
//maven 发布
id("maven-publish")
}
val checkGroupId = project.properties["GROUP_ID"] as String
var checkVersion = project.properties["VERSION"] as String
//指定插件 ID 和入口
gradlePlugin {
plugins {
create("Check") {
//1、同 agp7+ 应用插件的 ID,apply plugin: 'com.primer.plugin'
//2、会再发布一个 id + gradle.plugin 的 pom
id = checkGroupId
group = checkGroupId
version = checkVersion
implementationClass = "com.primer.plugin.Check"
}
}
}
//插件发布
publishing {
repositories {
maven {
isAllowInsecureProtocol = true
credentials {
username = "123456"
password = "123456"
}
url = uri("http://maven 私服地址")
}
}
}
问题根本原因是:
使用插件 id("java-gradle-plugin") 创建插件 gradlePlugin-plugins-create
会自动创建 publications
,无需重复配置