(AS笔记)上传aar包到Maven中央仓库

目录

一、SonaType账户注册与登录

        (1)注册

        (2)登录

二、创建工单

        (1)Github子域名验证

(2)自定义域名验证

三、登录Nexus Repository Manager

四、GPG签名生成和发布

五、Android推送aar包

        (1)配置私钥

        (2)配置Gradle推送参数

        snapshot-sonatype-publish.gradle

        release-sonatype-publish.gradle

        将配置引入Module的build.gradle

六、开始推送

七、验证推送成功

        (1)nexus repository manager 快照版

         (2)nexus repository manager 发布版

        (3)https://mvnrepository.com/

八、使用发布成功的aar

        (1)nexus repository manager

         (2)已发布到mvnrepository(中央仓库)

        (3)引入aar依赖成功

九、总结


成功上传效果图


一、SonaType账户注册与登录

        (1)注册

        想要推送到maven中央仓库,须先完成账户注册。

        访问SonaType官网:https://issues.sonatype.org/


        (2)登录

 

登录成功


二、创建工单

        创建一个工单项目为Maven Central,由外国人跟踪工单审核后即可上传到Maven仓库的快照库和发布库。(说明:所有Maven Central的资源库,都从Maven发布库间隔几小时更新)

        工单新建后:耐心等待外国大佬审核,他们处理后会向注册时提供的邮箱发送一条英文邮箱。翻译后如下:

        另外注意一点:Already Synced to Central 必须选为Yes, 将自己的依赖库aar自动同步到中央仓库。

 


        (1)Github子域名验证

        按照邮箱要求创建了项目后,耐心等待外国大佬回复即可。 


(2)自定义域名验证

        本人有自己备案的域名,因此需要去腾讯云DNS解析加上TXT记录。

        这里已经完成添加,接下来怎么办?当然是催审了,直接在项目下方追加评论。 英语不好,先翻译copy复制过去。

         等着回复就行......任何更新状态不管自己新增、追加平台、响应我们,都会通过邮箱通知的。

由于审核时间耽误我写博客,此处用我上一次工单的信息来继续


三、登录Nexus Repository Manager

        访问仓库管理首页:Nexus Repository Manager

        重要说明:登录这个账户与 SonaType注册的账户一样的。登录前提:需要外国大佬全部审核通过,给你开启登录权限、存储权限才可以登录上去。

        说明:在Android使用Maven推送插件将资源库推送到Nexus Repository Manager 中,会依据Version是否带有后缀来自动选择推送到快照库还是发布库。如1.0.0-SNAPSHOT 会推送到快照库, 1.0.0 会推送到发布库。当然你如果非要将1.0.0-SNAPSHOT推送到发布库、1.0.0推送到快照库,其实也行,只是不太正规。。按照行内规矩推送就行。


四、GPG签名生成和发布

         GPG是RSA算法加解密软件,将生成的公钥上传到公网能访问的公开密钥库中,其他服服务解密验证私钥后可以进行相关安全的业务操作。因次,SonaType也需要对aar包、jar等依赖库进行加密传输与解密下载,因此需要用到GPG。GPG可以按照在客户端,生成公钥后发布到公网能访问的公开密钥中,私钥本地存储。私钥证书有文件、keyId、密码。这些会在推送资源包时用到。

        GPG安装和使用及生成公钥发布到公网库、私钥存储、keyID(证书指纹后8位)、password 详见:Windows平台GPG签名生成和发布_gpg1.50.2下载_VinRichard的博客-CSDN博客


五、Android推送aar包

        Android借助Gradle推送,Gradle7.0以下使用 apply plugin: 'maven'、Gradle7.0以上 使用 apply plugin: 'maven-publish',本文使用的是Grale7.0以上。

        (1)配置私钥

        在AndroidStudio的gradle.properties配置文件中,编辑以下信息

# Signing Plugin Config
signing.keyId= 证书指纹后8位
signing.password=证书密码
signing.secretKeyRingFile=file:H://xx//xx//_SECRET.gpg 证书本地绝对路径

        (2)配置Gradle推送参数

        在Moudle根目录新建文件:snapshot-sonatype-publish.gradle(配置快照库release-sonatype-publish.gradle(配置发布库。配置内容如下:(本人习惯分开配置,因为尝试过用一个配置文件,在其中判断版本后缀是否带有SNAPSHOT来动态选择推送是发布库还是快照库

        snapshot-sonatype-publish.gradle

apply plugin: 'maven-publish'
apply plugin: 'signing'

//仓库的用户名
static def getRepositoryUsername() {
    return "SonaType注册的登录用户名"
}

//仓库的密码
static def getRepositoryPassword() {
    return "SonaType注册的登录密码"
}

if (project.hasProperty("android")) { // Android库
    task sourcesJar(type: Jar) {
        classifier = 'sources'
        from android.sourceSets.main.java.srcDirs
    }
    task javadoc(type: Javadoc) {
        excludes = ['**/*.kt'] // 从javadoc文件中排除所有kotlin文件
        source = android.sourceSets.main.java.srcDirs
        classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
        options.encoding = "utf-8"
        options.charSet = "utf-8"
    }
} else { //Java库
    task sourcesJar(type: Jar, dependsOn: classes) {
        classifier = 'sources'
        from sourceSets.main.allSource
    }
}

// 强制Java编码为UTF-8
tasks.withType(JavaCompile) {
    options.encoding = "UTF-8"
}

//强制JavaDoc编码为UTF-8
tasks.withType(Javadoc) {
    options.encoding = "UTF-8"
}

task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
}

//签名
signing {
    //required { gradle.taskGraph.hasTask("afterEvaluate") }
    sign configurations.archives
}

//配置上传包的参数
afterEvaluate {
    publishing {
        publications {
            myReleasePlugin(MavenPublication) {
                groupId 'xxxx'//对应sonatype平台新建中的Group Id
                artifactId 'xxx' //项目唯一标识符,对应项目名称
                version '1.0.0-SNAPSHOT' //发布为版本后缀是SNAPSHOT
                //artifact(javadocJar)//将javadoc文档工件打包进aar
                artifact(sourcesJar)//将Java注释工件打包进aar
                // 依赖 bundleDebugAar 任务,并上传其产出的aar
                artifact(tasks.getByName("bundleReleaseAar"))
                // 依赖传递:pom文件中声明依赖,从而传递到使用方,aar使用的依赖都打包进这个moudle,引入这个moudle依赖时,其他的依赖自动下载。本人不使用,避免重复依赖太多,项目过大
//                pom.withXml {
//                    def dependenciesNode = asNode().appendNode('dependencies')
//                    configurations.implementation.allDependencies.each {
//                        // 避免出现空节点或 artifactId=unspecified 的节点
//                        if (it.group != null && (it.name != null && "unspecified" != it.name) && it.version != null) {
//                            println "dependency=${it.toString()}"
//                            def dependencyNode = dependenciesNode.appendNode('dependency')
//                            dependencyNode.appendNode('groupId', it.group)
//                            dependencyNode.appendNode('artifactId', it.name)
//                            dependencyNode.appendNode('version', it.version)
//                            dependencyNode.appendNode('scope', 'implementation')
//                        }
//                    }
//                }
                //项目配置
                pom {
                    packaging 'aar' //安卓Library库:aar 、后端Java:jar
                    name = 'xxx' // 发布库的简单名称 在maven仓库的命名
                    description = 'Androidxxx插件库' // 发布库的描述
                    url = 'https://github.com/用户名/项目名' //Github项目首页
                    //Git项目信息
                    scm {
                        //git项目连接地址
                        connection = 'https://https://github.com/用户名/项目名.git'
                        //git项目开发者连接地址
                        developerConnection = 'https://github.com/用户名/项目名.git'
                        //Github项目首页
                        url = 'https://github.com/用户名/项目名.git'
                    }
                    // 开放许可证书
                    licenses {
                        license {
                            //许可名称
                            name = 'The Apache License, Version 2.0'
                            //许可URL
                            url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                        }
                    }
                    //开发者SonaType账号的信息——右上角用户信息——汇总 头像下方的三条信息
                    developers {
                        developer {
                            //全名
                            id = 'xxx'
                            //用户名
                            name = 'xxx'
                            //邮箱
                            email = 'xxx@qq.com'
                        }
                    }
                }
            }
        }
    }
}

//配置上传SonaType仓库Maven地址和密码
publishing {
    repositories {
        //开发版
        maven {
            url 'https://s01.oss.sonatype.org/content/repositories/snapshots/'
            credentials {
                username = getRepositoryUsername()
                password = getRepositoryPassword()
            }
        }
    }
}

        release-sonatype-publish.gradle

apply plugin: 'maven-publish'
apply plugin: 'signing'

//仓库的用户名
static def getRepositoryUsername() {
    return "SonaType注册的登录用户名"
}

//仓库的密码
static def getRepositoryPassword() {
    return "SonaType注册的登录密码"
}

if (project.hasProperty("android")) { // Android库
    task sourcesJar(type: Jar) {
        classifier = 'sources'
        from android.sourceSets.main.java.srcDirs
    }
    task javadoc(type: Javadoc) {
        excludes = ['**/*.kt'] // 从javadoc文件中排除所有kotlin文件
        source = android.sourceSets.main.java.srcDirs
        classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
        options.encoding = "utf-8"
        options.charSet = "utf-8"
    }
} else { //Java库
    task sourcesJar(type: Jar, dependsOn: classes) {
        classifier = 'sources'
        from sourceSets.main.allSource
    }
}

// 强制Java编码为UTF-8
tasks.withType(JavaCompile) {
    options.encoding = "UTF-8"
}

//强制JavaDoc编码为UTF-8
tasks.withType(Javadoc) {
    options.encoding = "UTF-8"
}

task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
}

//签名
signing {
    //required { gradle.taskGraph.hasTask("afterEvaluate") }
    sign configurations.archives
}

//配置上传包的参数
afterEvaluate {
    publishing {
        publications {
            myReleasePlugin(MavenPublication) {
                groupId 'xxxx'//对应sonatype平台新建中的Group Id
                artifactId 'xxx' //项目唯一标识符,对应项目名称
                version '1.0.0-SNAPSHOT' //发布为版本没有
                //artifact(javadocJar)//将javadoc文档工件打包进aar
                artifact(sourcesJar)//将Java注释工件打包进aar
                // 依赖 bundleDebugAar 任务,并上传其产出的aar
                artifact(tasks.getByName("bundleReleaseAar"))
                // 依赖传递:pom文件中声明依赖,从而传递到使用方,aar使用的依赖都打包进这个moudle,引入这个moudle依赖时,其他的依赖自动下载。本人不使用,避免重复依赖太多,项目过大
//                pom.withXml {
//                    def dependenciesNode = asNode().appendNode('dependencies')
//                    configurations.implementation.allDependencies.each {
//                        // 避免出现空节点或 artifactId=unspecified 的节点
//                        if (it.group != null && (it.name != null && "unspecified" != it.name) && it.version != null) {
//                            println "dependency=${it.toString()}"
//                            def dependencyNode = dependenciesNode.appendNode('dependency')
//                            dependencyNode.appendNode('groupId', it.group)
//                            dependencyNode.appendNode('artifactId', it.name)
//                            dependencyNode.appendNode('version', it.version)
//                            dependencyNode.appendNode('scope', 'implementation')
//                        }
//                    }
//                }
                //项目配置
                pom {
                    packaging 'aar' //安卓Library库:aar 、后端Java:jar
                    name = 'xxx' // 发布库的简单名称 在maven仓库的命名
                    description = 'Androidxxx插件库' // 发布库的描述
                    url = 'https://github.com/用户名/项目名' //Github项目首页
                    //Git项目信息
                    scm {
                        //git项目连接地址
                        connection = 'https://https://github.com/用户名/项目名.git'
                        //git项目开发者连接地址
                        developerConnection = 'https://github.com/用户名/项目名.git'
                        //Github项目首页
                        url = 'https://github.com/用户名/项目名.git'
                    }
                    // 开放许可证书
                    licenses {
                        license {
                            //许可名称
                            name = 'The Apache License, Version 2.0'
                            //许可URL
                            url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                        }
                    }
                    //开发者SonaType账号的信息——右上角用户信息——汇总 头像下方的三条信息
                    developers {
                        developer {
                            //全名
                            id = 'xxx'
                            //用户名
                            name = 'xxx'
                            //邮箱
                            email = 'xxx@qq.com'
                        }
                    }
                }
            }
        }
    }
}

//配置上传SonaType仓库Maven地址和密码
publishing {
    repositories {
        //发布版
        maven {
            url 'https://s01.oss.sonatype.org/content/repositories/releases/'
            credentials {
                username = getRepositoryUsername()
                password = getRepositoryPassword()
            }
        }
    }
}

        将配置引入Module的build.gradle

plugins {
    id 'com.android.library'
}
//sonatype平台的maven中央库配置文件
//发布版
//apply from: "release-sonatype-publish.gradle"
//开发版
apply from: "snapshot-sonatype-publish.gradle"

android {
    compileSdk 31

    defaultConfig {
        minSdk 16
        targetSdk 33
        versionCode 1
        versionName "1.0"
        ...

至此,配置完成!


六、开始推送

        此处将moudle名为utils的aar包推送到Maven快照库。 


七、验证推送成功

        (1)nexus repository manager 快照版


         (2)nexus repository manager 发布版


        (3)https://mvnrepository.com/


八、使用发布成功的aar

        (1)nexus repository manager

        //SonaType Maven 仓库地址
        maven { url 'https://s01.oss.sonatype.org/content/repositories/releases/'}
        maven { url 'https://s01.oss.sonatype.org/content/repositories/snapshots/'}

说明:必须在AndroidStudio项目根目录setting.gradle问加入以上两行maven地址,下载依赖时会去里面下载(因为这里面是我们发布推送进去的)。

使用快照版的,快照版去掉-SNAPSHOT


         (2)已发布到mvnrepository(中央仓库)

    mavenCentral()

 说明:必须在AndroidStudio项目根目录setting.gradle问加入mavenCentral()


        (3)引入aar依赖成功


九、总结

仅自己学习记录,如有错误,敬请谅解~,谢谢~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/94611.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IEC 60068 环境测试介绍及其标准下载

IEC 60068 环境测试介绍及其标准下载 IEC 60068 标准由国际电工委员会 (IEC) 发布,是用于电工产品环境测试的国际标准。 IEC 60068 系列包含有关标准、环境测试程序和测试严重性的基本信息。 IEC 60068 环境测试 制定这一系列标准是为了在特定产品类型&#xff08…

C语言(第三十一天)

6. 调试举例1 求1!2!3!4!...10!的和&#xff0c;请看下面的代码&#xff1a; #include <stdio.h> //写一个代码求n的阶乘 int main() {int n 0;scanf("%d", &n);int i 1;int ret 1;for(i1; i<n; i){ret * i;}printf("%d\n", ret);return …

线性代数(五) 线性空间

前言 《线性代数(三) 线性方程组&向量空间》我通过解线性方程组的方式去理解线性空间。此章从另一个角度去理解 空间是什么 大家较熟悉的&#xff1a;平面直角坐标系是最常见的二维空间 空间由无穷多个坐标点组成 每个坐标点就是一个向量 反过来&#xff0c;也可说&…

【附安装包】CAD2024(建筑版)安装教程

软件下载 软件&#xff1a;CAD建筑版本&#xff1a;2023语言&#xff1a;简体中文大小&#xff1a;4.52G安装环境&#xff1a;Win11/Win10硬件要求&#xff1a;CPU2.5GHz 内存8G(或更高&#xff09;下载通道①百度网盘丨64位下载链接&#xff1a;https://pan.baidu.com/s/1cHe…

万级数据优化EasyExcel+mybatis流式查询导出封装

文章目录 前言.万级数据优化一. 直接上流式查询封装工具代码二. 传统分页导出查询三. 流式查询概念游标查询 前言.万级数据优化 我们不妨先给大家讲一个概念&#xff0c;利用此概念我们正好给大家介绍一个数据库优化的小技巧&#xff1a; 需求如下&#xff1a;将一个地市表的数…

CSS中如何实现文字阴影效果(text-shadow)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 实现思路⭐ 示例⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前…

视频汇聚/视频云存储/视频监控管理平台EasyCVR安全检查的相关问题及解决方法

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

解读GIS软件:从ArcGIS到山海鲸可视化的全方位介绍

在现代社会&#xff0c;地理信息系统&#xff08;GIS&#xff09;的应用已经渗透到了各个领域&#xff0c;为我们提供了丰富的地理数据分析和可视化工具。下面介绍几款常见的GIS工具软件&#xff0c;一起来了解它们的特点和优势。 1. ArcGIS: ArcGIS由Esri公司开发&#xff0c;…

php环境搭建步骤(与资源配套使用版)

1.将phpEnv.zip下载到D盘下 2.解压到当前文件夹 3.找到Apache24下的bin目录&#xff0c;执行cmd操作&#xff0c;回车。 4.在cmd中执行代码 Httpd -k install -n “Apache24” 4.使用winR键打开运行&#xff0c;输入services.msc &#xff0c;回车&#xff0c;进入服务 …

ipad有必要用手写笔吗?开学季实惠的电容笔推荐

iPad平板的机型经过了一次又一次的升级&#xff0c;增加了更多的功能&#xff0c;如今已有了与笔记本电脑匹敌的能力。而到了如今&#xff0c;科技的发展&#xff0c;iPad也从一个娱乐工具&#xff0c;变成了一个集学习、画画、办公于一体的强大工具。为了提高生产效率&#xf…

PHP教学资源管理系统Dreamweaver开发mysql数据库web结构php编程计算机网页

一、源码特点 PHP 教学资源管理系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 源码 https://download.csdn.net/download/qq_41221322/88260480 论文 https://downl…

入海排污口水质自动监测系统,助力把好入河入海“闸门”

随着经济社会的不断发展&#xff0c;污水的排放强度不断加大&#xff0c;大量的污水排入河流、湖泊和海洋中&#xff0c;造成了水体污染&#xff0c;严重影响着我国的用水安全、公众健康、经济发展与社会稳定。入河入海排污口是污染物进入河流和海洋的最后关口&#xff0c;也是…

im6ull-uboot(2021.07)移植(一)

文章目录 声明1 获取源码1.1 从u-boot官网获取1.2 从芯片厂商获取1.3 从开发板厂商获取 2 修改顶层Makefile3 xxx_defconfig配置文件3.1 拷贝生成自己的配置文件3.2 修改defconfig文件3.2.1 查看defconfig文件3.2.2 修改defconfig文件 3.3 添加其他配置文件3.3.1 添加配置头文件…

计算机视觉与人工智能在医美人脸皮肤诊断方面的应用

一、人脸皮肤诊断方法 近年来&#xff0c;随着计算机技术和人工智能的不断发展&#xff0c;中医领域开始逐渐探索利用这些先进技术来辅助面诊和诊断。在皮肤望诊方面&#xff0c;也出现了一些现代研究&#xff0c;尝试通过图像分析技术和人工智能算法来客观化地获取皮肤相关的…

微软 Visual Studio 现已内置 Markdown 编辑器,可直接修改预览 .md 文件

Visual Studio Code V1.66.0 中文版 大小&#xff1a;75.30 MB类别&#xff1a;文字处理 本地下载 Markdown 是一种轻量级标记语言&#xff0c;当开发者想要格式化代码但又不想牺牲易读性时&#xff0c;Markdown 是一个很好的解决方案&#xff0c;比如 GitHub 就使用 Markdo…

7个用于机器学习和数据科学的基本 Python 库

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建3D应用场景 这篇文章针对的是刚开始使用Python进行AI的人&#xff0c;以及那些有经验的人&#xff0c;但对下一步要学习什么有疑问的人。我们将不时花点时间向初学者介绍基本术语和概念。如果您已经熟悉它们&#xff0c;我们鼓…

windows服务器查看网络带宽

windows服务器查看网络带宽&#xff1f; 鼠标右键单击win标志&#xff0c;进入计算机管理 另外一个方法&#xff1a;

【golang】15、cobra cli 命令行库

Cobra 是 golang 最流行的命令行库&#xff0c;文档见 一、脚手架 mkdir pt && cd pt && go mod init cobra-cli init # 在项目下运行即可生成脚手架# tree . ├── LICENSE ├── cmd # 生成了cmd目录 │ └── root.go # 生成了root.go, 其中定义了ro…

他们朝我扔泥巴(scratch)

前言 纯~~~属~~~虚~~~构~~~&#xff08;同学看完短视频要我做&#xff0c;蟹蟹你&#xff09; 用scratch做的&#xff0c;幼稚得嘞(&#xffe3;_&#xffe3;|||)呵呵&#xff08;强颜欢笑&#xff09; 完成视频 视频试了好久&#xff0c;就是传不上来&#xff0c;私信我加我…

Flutter问题记录 - Unable to find bundled Java version

新版本的Android Studio真的移除了JRE&#xff0c;jre目录找不到&#xff0c;怪不得报错了&#xff0c;不过多了一个jbr目录&#xff0c;找了个以前的Android Studio版本对比 搜了一下jbr&#xff08;JetBrains Runtime&#xff09;&#xff0c;原来IDEA老早就开始用了&#xf…