(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.srcDirsclasspath += 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 IdartifactId 'xxx' //项目唯一标识符,对应项目名称version '1.0.0-SNAPSHOT' //发布为版本后缀是SNAPSHOT//artifact(javadocJar)//将javadoc文档工件打包进aarartifact(sourcesJar)//将Java注释工件打包进aar// 依赖 bundleDebugAar 任务,并上传其产出的aarartifact(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:jarname = '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'//许可URLurl = '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.srcDirsclasspath += 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 IdartifactId 'xxx' //项目唯一标识符,对应项目名称version '1.0.0-SNAPSHOT' //发布为版本没有//artifact(javadocJar)//将javadoc文档工件打包进aarartifact(sourcesJar)//将Java注释工件打包进aar// 依赖 bundleDebugAar 任务,并上传其产出的aarartifact(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:jarname = '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'//许可URLurl = '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 31defaultConfig {minSdk 16targetSdk 33versionCode 1versionName "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依赖成功


九、总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Springboot启动异常 Command line is too long

Springboot启动异常 Command line is too long Springboot启动时直接报异常 Command line is too long. Shorten command line for xxxxxApplication or also for Spring Boot default解决方案: 修改 SystemApplication 的 Shorten command line,选择 JAR manife…

数学建模:数据的预处理

🔆 文章首发于我的个人博客:欢迎大佬们来逛逛 文章目录 数据预处理数据变换数据清洗缺失值处理异常值处理 数据预处理 数据变换 常见的数据变换的方式:通过某些简单的函数进行数据变换。 x ′ x 2 x ′ x x ′ log ⁡ ( x ) ∇ f ( x k )…

Jenkins测试报告样式优化

方式一:修改Content Security Policy(临时解决,Jenkins重启后失效) 1、jenkins首页—>ManageJenkins—>Tools and Actions标题下—>Script Console 2、粘贴脚本输入框中:System.setProperty("hudson.model.Directo…

word6 图文混排

目录 7-1 段落缩进排版7-2 搞定多级列表难题 7-1 段落缩进排版 段落对齐 缩进问题 悬挂缩进:缩进首行以外的段落 段落对齐: 7-2 搞定多级列表难题

MySQL数据库之索引

目录 一、索引的概念 二、索引的作用 三、索引的副作用 四、创建索引的规则 1、适合创建为索引的字段的规则 2、MySQL的优化 哪些字段/场景适合创建索引,哪些不适合 五、索引的分类和创建 1、索引的分类 2、三种创建方式 3、索引的创建演示 1、创建普通索…

Lvs+KeepAlived高可用高性能负载均衡

目录 1.环境介绍 2.配置keepalived 3.测试 1.测试负载均衡 2.测试RS高可用 3.测试LVS高可用 3.1测试lvs主服务宕机 3.2.测试lvs主服务器恢复 4.我在实验中遇到的错误 1.环境介绍 环境:centos7 RS1---RIP1:192.168.163.145 VIP 192.168.163.200 RS2---RIP2…

css强制显示一行

要强制将文本内容显示在一行中,可以使用CSS的white-space属性和overflow属性来实现。 首先,将white-space属性设置为nowrap,这样文本内容就不会换行。然后,将overflow属性设置为hidden,这样超出一行的内容就会被隐藏起…

带纽扣电池产品出口澳洲安全标准,纽扣电池IEC 60086认证

澳大利亚政府公布了《消费品(纽扣/硬币电池)安全标准》和《消费品(纽扣/硬币电池)信息标准》。届时出口纽扣/硬币电池以及含有纽扣/硬币电池产品到澳大利亚的供应商,必须遵守这些标准中的要求。 一、 安全标准及信息标…

【SQL中DDL DML DQL DCL所包含的命令】

SQL中DDL DML DQL DCL所包含的命令 关于DDL、DML、DQL、DCL的定义和适用范围如下: 数据定义语言(Data Definition Language,DDL): DDL用于创建、修改和删除数据库中的表、视图、索引等对象。它的主要命令包括CREATE、A…

Xshell7和Xftp7的下载、安装及连接服务器的教程

1.下载 1.官网地址: XSHELL - NetSarang Website 选择学校免费版下载 2.将XSHELL和XFTP全都下载下来 2.安装 安装过程就是选择默认选项,然后无脑下一步 3.连接服务器 1.打开Xshell7,然后新建会话 2.填写相关信息 出现Connection establ…

问道管理:暂停交易!港交所最新宣布,北向资金也受影响!大涨超180%

今日上午A股商场全体涨跌互现,煤炭板块涨幅居前。新股方面也体现较好,有一只新股盘中一度暴涨超越180%。 别的,飓风“苏拉”对股市也产生了影响。港交所最新公告称,因为八号飓风信号现正收效,今日(星期五&…

安防监控视频平台EasyCVR视频汇聚平台定制项目增加AI智能算法详细介绍

安防视频集中存储EasyCVR视频汇聚平台,可支持海量视频的轻量化接入与汇聚管理。平台能提供视频存储磁盘阵列、视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、平台级联、H.265自动转码等功能。为了便…

QT可执行程序打包成安装程序

目录 1.将QT程序先放到一个文件中 2.下载QtInstallerFramework-win-x86.exe 3.将setup.exe单独拷贝出来,进行安装测试 4.测试安装后的程序是否可执行 1.将QT程序先放到一个文件中 (1)QT切换到release模式,编译后在构建目录生…

显示本地 IP 地址和相应的 QR 码,方便用户共享和访问网络信息

这段代码使用了 wxPython、socket、qrcode 和 PIL(Python Imaging Library)模块来生成一个具有本地 IP 地址和相应 QR 码的窗口应用程序。 C:\pythoncode\new\showipgenqrcode.py 让我们逐行解释代码的功能: import wx:导入 wx…

大规模数据爬取 - 增量和分布式爬虫架构实战

嗨,亲爱的爬虫开发者们!在当今的数据驱动时代,大规模数据的爬取对于许多领域的研究和应用至关重要在本文中,我将与你分享大规模数据爬取的实战经验,重点介绍增量和分布式爬虫架构的应用,帮助你高效地处理海…

fastdds之core

目录 Entity Entity

Docker consul 容器服务自动发现和更新

目录 一、什么是服务注册与发现 二、Docker-consul集群 1.Docker-consul consul提供的一些关键特性 2.registrator 3.Consul-template 三、Docker-consul实现过程 以配置nginx负载均衡为例 先配置consul-agent ,有两种模式server和client 四、Docker-cons…

39.RESTful案例

RESTful案例 准备环境 Employee.java public class Employee {private Integer id;private String lastName;private String email;//1 male, 0 femaleprivate Integer gender; } //省略get、set和构造方法EmployeeDao.java package com.atguigu.SpringMVC.dao;import com.…

matlab使用教程(24)—常微分方程(ODE)求解器

1.常微分方程 常微分方程 (ODE) 包含与一个自变量 t(通常称为时间)相关的因变量 y 的一个或多个导数。此处用于表示 y 关于 t 的导数的表示法对于一阶导数为 y ′ ,对于二阶导数为 y ′′,依此类推。ODE 的阶数等于 y 在方程中…

Angular安全专辑之四 —— 避免服务端可能的资源耗尽(NodeJS)

express-rate-limit是一个简单实用的npm包,用于在Express应用程序中实现速率限制。它可以帮助防止DDoS攻击和暴力破解,同时还允许对API端点进行流控。 express-rate-limit及其主要功能 express-rate-limit是Express框架的一个流行中间件,它允许根据IP地址或其他标准轻松地对请求…