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

news2025/1/20 3:48:44

目录

一、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依赖成功


九、总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PHP8内置函数中的数学函数-PHP8知识详解

php8中提供了大量的内置函数,以便程序员直接使用常见的内置函数包括数学函数、变量函数、字符串函数、时间和日期函数等。今天介绍内置函数中的数学函数。 本文讲到了数学函数中的随机数函数rand()、舍去法取整函数floor()、向上取整函数 ceil()、对浮点数进行四舍…

【LeetCode每日一题】——1365.有多少小于当前数字的数字

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 排序 二【题目难度】 简单 三【题目编号】 1365.有多少小于当前数字的数字 四【题目描述】 …

RHCE——十一、NFS服务器

NFS服务器 一、简介1、NFS背景介绍2、生产应用场景 二、NFS工作原理1、示例图2、流程 三、NFS的使用1、安装2、配置文件3、主配置文件分析3.1 实验1 4、NFS账户映射4.1 实验24.2 实验3 四、autofs自动挂载服务1、产生原因2、安装3、配置文件分析4、实验45、实验5 一、简介 1、…

【c++】VC编译出的版本,发布版本如何使用

目录 使用release类型进行发布 应用程序无法正常启动 0xc000007b 版本对应 vcruntime140d 应用版本 参考文章 使用release类型进行发布 应用程序无法正常启动 0xc000007b "应用程序无法正常启动 0xc000007b" 错误通常是一个 Windows 应用程序错误&#xf…

手机拍摄的视频太大怎么压缩?快来学视频压缩

随着手机的普及和视频拍摄的简单化,我们经常会在手机上一不小心就拍摄出大量的视频内容。但这些视频文件往往会占用大量的存储空间,给我们的日常生活带来不便。那么,如何压缩这些过大的视频文件呢? 视频压缩的主要原理是利用视频序…

易云维®FMCS厂务系统创造工厂全新的“数字低碳智能”应用场景

近年来,新一代信息技术的高速发展为传统工业与制造业领域带来了新的机遇。信息技术加持下的制造技术发展出了新的生产方式、产业形态与管理模式。通过搭建FMCS厂务系统进行数字化转型来实现数据互联互通与业务高效协同,助力企业向安全、绿色、节能、高效…

软件测试全生命周期全流程解析

一、软件测试的基本概念 1.测试是软件生存周期中十分重要的一个过程,是产品发布、提交给最终用户前的稳定化阶段。 2.软件测试是为了发现错误而执行程序的过程。或者说,软件测试是根据软件开发各阶段的规格说明和程序内部结构而精心设计的一批 二、软…

winrar代码执行漏洞CVE-2023-38831复现

工具下载: winrar5.50:https://www.rarlab.com/rar/winrar-x64-550.exe 7-z:https://www.7-zip.org/ 创建文件夹目录如下 测试- image(文件夹,此命名随意)- xingkong.png(一张图片&#xff0c…

【Unity3D赛车游戏】【七】如何在Unity中为汽车添加自动变速箱自动换挡?

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

智能工单系统哪家好?如何提升企业维修效率与管理效能?

在互联网信息时代,许多行业已经完成了电子信息化的转变,并从中受益。对于公司而言,SaaS云产品系列提供了更低的成本、更强大的功能以及更好的客户体验。那么,与传统报修工单相比,智能工单有哪些优势呢? 首先…

9个至少提升50%效率的VSCODE插件

在开始编码之前,您首先需要让您的工作流程适合您。让它更高效、更漂亮、更可定制。它会节省您大量的时间和精力,因此您将有更多的能力进行编码。 无论您是前端还是后端开发人员还是高级 Java 程序员,都没关系。这篇文章对你们大多数人来说仍然…

问道管理:融资融券门槛?

融资融券是股票出资中的一种买卖方式,也是现代股市正常运作的重要机制之一。但是,由于融资融券具有利润高、危险大的特色,为了保护大多数出资者的利益,也为了确保股市的安稳运转,国家对融资融券的门槛做出了一系列规则…

一个国产存储一致性及稳定性测试工具介绍

项目地址:https://github.com/zhangyoujia/hd_write_verify 序言 hd_write_verify & hd_write_verify_dump 是测试磁盘稳定性和验证数据一致性的工具。可以测试 物理磁盘、虚拟机磁盘 等。相对于fio和vdbench等工具,此工具更加专注于数据对丢失、数…

lab9 fs

文章目录 Large filestaskhints思路 Symbolic linkstaskhints思路sys_symlinksys_open Large files 目标:11256256*256个block inode的格式在fs.h的struct dinode中被定义,你需要特别注意以下几点 NDIRECTNINDIRECTMAXFILEaddrs[] 在磁盘上找一个文件…

OpenGL手册

基础知识 图元类型 内置变量 GLSL 中文手册 基本类型: 类型说明void空类型,即不返回任何值bool布尔类型 true,falseint带符号的整数 signed integerfloat带符号的浮点数 floating scalarvec2, vec3, vec4n维浮点数向量 n-component floating point vectorbvec2, bvec3, b…

Midjourney学习(三)6个高级应用

使用Remix Mode在原图片的基础上进行二次创作 通过prompt得到大图之后,点击Make Variations按钮,输入Remix Prompt,即可得到意想不到的效果! 局部内容重绘 通过局部重绘可以实现对画面内容更加精细化的控制,同样也是需…

【数学建模】清风数模正课7 多元线性回归模型

多元线性回归分析 回归分析就是,通过研究自变量X和因变量Y的相关关系,来解释Y的形成机制,从而达到通过X去预测Y的目的。 所以回归分析需要完成三个使命,首先是识别重要变量,其次是判断正负相关,最后是估计…

PCB电路板电压电流监测软件

PCB电路板电流监测软件详细设计说明书是一个详细描述软件系统设计和实现的文档,它提供了软件系统的架构、功能模块、接口设计、数据存储和处理、界面设计、数据库设计、系统测试、部署和维护计划等方面的详细信息。模拟量采集/老化房采集软件 该文档的目的是为了确保…

企业工程系统管理 工程项目管理系统源码 工程项目各模块及其功能点清单

工程项目各模块及其功能点清单 一、系统管理 1、数据字典:实现对数据字典标签的增删改查操作 2、编码管理:实现对系统编码的增删改查操作 3、用户管理:管理和查看用户角色 4、菜单管理:实现对系统菜单的增删改查操…

百亿数据查询秒级响应,观测体系之日志中心该如何玩转?

日志是处理生产故障、性能优化、业务分析的重要参考依据,是系统稳定运行不可或缺的一部分。随着业务系统规模急剧膨胀增大,尤其是是微服务架构逐渐普及,一个系统可能涉及多个应用模块与服务实例,传统模式下运维人员去定位问题显得…