适配 AGP8.5,maven 私服发布报错(七)

在这里插入图片描述

我们知道,如果同一个版本发布两次

那么第二次会报错,大概意思是 maven 私服同一个版本只能发布一次,不能覆盖

或许可以设置强行覆盖,即使支持版本覆盖一般也不会这么干

问题

为什么我点击一次 publish 同一个版本上传了两次(发布了两次)

分析

有问题:会发布两次的配置

build.gradle.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

这一看可能不知道这些任务是做什么的,输出产物是什么?

那我们就挨个任务点击运行,看看关键任务输出的产物是什么

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+ 创建插件

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

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,无需重复配置

根据提供的引用内容,你遇到了在使用IDEA和Maven时出现私服报错的问题。这可能是由于配置问题或者网络连接问题导致的。下面是一些可能的解决方法: 1. 检查Maven配置:确保你的Maven配置文件(settings.xml)中正确配置了私服的URL和凭据。你可以在该文件中添加以下内容: ```xml <servers> <server> <id>your_server_id</id> <username>your_username</username> <password>your_password</password> </server> </servers> ``` 请将`your_server_id`替换为私服的ID,`your_username`和`your_password`替换为你的私服凭据。 2. 检查网络连接:确保你的网络连接正常,并且可以访问私服的URL。你可以尝试使用浏览器或者命令行工具(如curl或wget)访问私服的URL,以确认是否可以正常连接。 3. 清理Maven缓存:有时候Maven缓存中的某些文件可能会导致问题。你可以尝试清理Maven的本地仓库缓存,然后重新构建项目。你可以使用以下命令清理Maven缓存: ```shell mvn dependency:purge-local-repository ``` 4. 更新Maven依赖:如果你的项目依赖的某些库已经更新了版本,但是私服中还没有同步更新,可能会导致报错。你可以尝试更新你的项目依赖,或者在Maven配置文件中添加其他可用的仓库。 希望以上方法能够帮助你解决问题。如果问题仍然存在,请提供更多的错误信息和具体的配置细节,以便我们能够更好地帮助你。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值