AndroidStudio使用maven-publish发布aar至mavencentral中央仓库

news2024/11/17 11:50:37

目录

  • AndroidStudio使用maven-publish发布aar至mavencentral中央仓库
    • 1、注册[【sonatype】](https://issues.sonatype.org/secure/Signup!default.jspa)
    • 2、创建Group ID
    • 3、下载安装[gnupg](https://www.gnupg.org/download/index.html)
    • 4、创建生成密钥
    • 5. 配置maven-publish打包推送aar
    • 6. 发布到mavencentral中央仓库
    • 7. 从mavencentral中央仓库依赖使用发布的AAR

AndroidStudio使用maven-publish发布aar至mavencentral中央仓库

  1. 注册【sonatype】账号
  2. 创建Group ID
  3. 下载安装gnupg
  4. 创建生成密钥
  5. 配置maven-publish打包推送aar
  6. 发布到mavencentral中央仓库
  7. 从mavencentral中央仓库依赖使用发布的AAR

1、注册【sonatype】

打开注册地址,如图填写自己的信息,点击signup进行注册。密码要求的比较严格,我一般都是设置的包含大小写字母、数字、符号。密码中也不能出现用户名。
sonatype注册

2、创建Group ID

第一步注册成功之后,直接登录。
首先点击【新建】创建问题。项目及问题类型,选择如下图。
新建project
create

点击【新建】提交成功之后,会产生一个问题工单,等待工单的处理。
使用github的话,一般都是让在对应的GitHub创建一个指定名称(OSSRH-****)的public存储库,用于验证所填写的 io.github.** 是否是自己的。

当在GitHub上创建完对应的public存储库以后,需要点击【备注】对工单进行回复处理。一般用英文随便回复两句,客气客气。
比如我用菜的抠脚的英文回复:(O(∩_∩)O哈哈~,总之让老外能看懂就行)

Hello, the repository has been created.
please check, thanks

一般回复完,等个几分钟,工单状态变成“已解决”,就说明我们的 Group ID 创建完成了,以后就可以向自己填写的Group ID下面发布了。

3、下载安装gnupg

由于maven-publish发布时需要签名,得下载安装gnupg。
我的电脑是Windows系统,这里就下载Gpg4win。根据自己的系统,自行选择对应版本。
安装完成即可。
GPG下载

检查是否安装成功,在控制台输入 gpg --version。能看到版本号就OK。

PS E:\Android> gpg --version
gpg (GnuPG) 2.3.8
libgcrypt 1.10.1
Copyright (C) 2021 g10 Code GmbH
License GNU GPL-3.0-or-later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: C:\Users\Administrator\AppData\Roaming\gnupg
Supported algorithms:
Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
        CAMELLIA128, CAMELLIA192, CAMELLIA256
AEAD: EAX, OCB
Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2

4、创建生成密钥

  1. 使用 gpg --full-generate-key 命令创建密钥
  2. Your selection? 填写 1 ,选择 RSA and RSA
  3. What keysize do you want? (3072) 默认3072,这里我们填写 4096
  4. Key is valid for? (0) 默认填 0,密钥不过期。
  5. Real name: 填写名称
  6. Email address: 自己邮箱
  7. Comment: 可以不填,直接回车
  8. Change (N)ame, ©omment, (E)mail or (O)kay/(Q)uit? 填写大写字母 O, 直接回车确定 。
  9. 耐心等待创建完成,可能需要十几秒时间。

过程中会弹窗提示输入密钥的密码,输入两次密码,确认保存即可。(这里的密码记录保存好,后面会用到)
密钥密码

完整示例如下:

PS E:\Android> gpg --full-generate-key
gpg (GnuPG) 2.3.8; Copyright (C) 2021 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Please select what kind of key you want:
   (1) RSA and RSA
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
   (9) ECC (sign and encrypt) *default*
  (10) ECC (sign only)
  (14) Existing key from card
Your selection? 1
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072) 4096
Requested keysize is 4096 bits
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 0
Key does not expire at all
Is this correct? (y/N) y

GnuPG needs to construct a user ID to identify your key.

Real name: mtjsoft1
Email address: mtjsoft3@gmail.com
Comment:
You selected this USER-ID:
    "mtjsoft1 <mtjsoft3@gmail.com>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
gpg: revocation certificate stored as 'C:\\Users\\Administrator\\AppData\\Roaming\\gnupg\\openpgp-revocs.d\\BA571B36612AED30A650910F51CAEFFD7F1790E5.rev'
public and secret key created and signed.

pub   rsa4096 2022-11-26 [SC]
      BA571B36612AED30A650910F51CAEFFD7F1790E5
uid                      mtjsoft1 <mtjsoft3@gmail.com>
sub   rsa4096 2022-11-26 [E]

最后我们可以使用 gpg --list-keys 命令查看创建的密钥。

PS E:\Android> gpg --list-keys
C:\Users\Administrator\AppData\Roaming\gnupg\pubring.kbx
--------------------------------------------------------
pub   rsa4096 2022-11-24 [SC]
      BF81E3FF1A632D36CE42C7137396A6CBC4693B36
uid           [ultimate] readcard <mtjsoft3@gmail.com>
sub   rsa4096 2022-11-24 [E]

pub   rsa4096 2022-11-26 [SC]
      BA571B36612AED30A650910F51CAEFFD7F1790E5
uid           [ultimate] mtjsoft1 <mtjsoft3@gmail.com>
sub   rsa4096 2022-11-26 [E]

发布证书,备份私钥

打开安装的 gnupg 软件

  1. 复制 密钥ID的后八位,发布aar时需要用到。
  2. 右键证书,在服务器上发布证书。如下图 步骤2。
  3. 右键证书,备份私钥,后缀名改成 .gpg。保存好,发布aar时需要使用到此文件。

5. 配置maven-publish打包推送aar

  1. 在根目录的 local.properties 中添加如下配置信息
# 要发布的版本名(以 SNAPSHOT 结尾的,为快照版本 如: 3.1.0-SNAPSHOTPUBLISH_VERSION=3.1.0
# 步骤2中创建的 GROUP_ID
PUBLISH_GROUP_ID=io.github.**
# 名称
PUBLISH_ARTIFACT_ID=FaceSDk
# 上面三个参数配置完。一般通过mavencentral引用aar的依赖时,就是这样子了
# implementation "io.github.**:FaceSDk:3.1.0"

# 步骤4中 密钥ID的后8位
signing.keyId=C4693B36
# 步骤4中 创建密钥时填写的密码
signing.password=mima
# 步骤4中 备份私钥保存的文件路径
signing.secretKeyRingFile=E\:\\Android\\0xC4693B36_SECRET.gpg

# 步骤1中 注册sonatype的用户名与密码
ossrhUsername=mtjsoft
ossrhPassword=mima
  1. 项目根目录创建 publish-mavencentral.gradle。直接复制修改几处注释的地方即可。
apply plugin: 'maven-publish'
apply plugin: 'signing'

// 此处不需修改,下面会读取 local.properties 中配置的信息
ext["PUBLISH_VERSION"] = '' //发布的版本
ext["PUBLISH_GROUP_ID"] = ''  //分组ID
ext["PUBLISH_ARTIFACT_ID"] = '' //
ext["signing.keyId"] = '' //签名的密钥后8位
ext["signing.password"] = ''  //签名设置的密码
ext["signing.secretKeyRingFile"] = '' //生成的secring.gpg文件目录
ext["ossrhUsername"] = ''  //sonatype用户名
ext["ossrhPassword"] = ''  //sonatype密码
// 遍历赋值
File secretPropsFile = project.rootProject.file('local.properties')
if (secretPropsFile.exists()) {
    println "Found secret props file, loading props"
    Properties p = new Properties()
    p.load(new FileInputStream(secretPropsFile))
    p.each { name, value ->
        ext[name] = value
    }
} else {
    println "No props file, loading env vars"
}

afterEvaluate {
    publishing {
        repositories {
            maven {
                //推送至远端的中央仓库,一旦发布release中央仓库版本,旧版本无法修改
                //一般都在  暂存库  中进行测试,然后确认无误后再发布到 release中央仓库
                allowInsecureProtocol = false
                name = PUBLISH_ARTIFACT_ID
                // 暂存库
                def releasesRepoUrl = "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/"
                // 快照库(版本名以 SNAPSHOT 结尾,就推送至快照库)
                def snapshotsRepoUrl = "https://s01.oss.sonatype.org/content/repositories/snapshots/"
                url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl

                credentials {
                    username ossrhUsername
                    password ossrhPassword
                }
            }
            maven {
                // 推送至本地存储库,本机测试的时候可以用
                allowInsecureProtocol = false
                name = 'Local'
                url = uri('../ZrgkLocalRepo')
            }
        }
        publications {
            release(MavenPublication) {
                println("publish-maven Log-------> PUBLISH_GROUP_ID: $PUBLISH_GROUP_ID; PUBLISH_ARTIFACT_ID: $PUBLISH_ARTIFACT_ID; PUBLISH_VERSION: $PUBLISH_VERSION")

                groupId PUBLISH_GROUP_ID
                artifactId PUBLISH_ARTIFACT_ID
                version PUBLISH_VERSION

                // 生成的 aar 路径,修改成自己的aar地址名称
                artifact("$buildDir/outputs/aar/face-release.aar")
                
                // 如果需要将源代码一起打包进aar,就打开此注释。
                //artifact androidSourcesJar

                pom {
                    name = PUBLISH_ARTIFACT_ID
                    description = '这是一段SDK的项目描述' //项目描述
                    url = 'https://github.com/***/***' //项目github链接
                    licenses {
                        license {
                            //协议类型,一般默认Apache License2.0的话不用改:
                            name = 'The Apache License, Version 2.0'
                            url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                        }
                    }
                    developers {
                        developer {
                            // 修改自己对应的用户名、邮箱
                            id = 'mtj' //你的sonatype用户名
                            name = 'mtj' //你的sonatype用户名
                            email = 'mtj@gmail.com' //你的sonatype注册邮箱
                        }
                    }
                    // Version control info, if you're using GitHub, follow the format as seen here
                    scm {
                        //修改成你的Git地址:
                        connection = 'scm:git@github.com:**/**.git'
                        developerConnection = 'scm:git@github.com:**/**.git'
                        //分支地址:
                        url = 'https://github.com/**/**'
                    }

                    withXml {
                        def dependenciesNode = asNode().appendNode("dependencies")
                        configurations.implementation.allDependencies.forEach() {
                            Dependency dependency ->
                                if (dependency.version != "unspecified" && dependency.name != "unspecified") {
                                    def dependencyNode = dependenciesNode.appendNode('dependency')
                                    dependencyNode.appendNode('groupId', dependency.group)
                                    dependencyNode.appendNode('artifactId', dependency.name)
                                    dependencyNode.appendNode('version', dependency.version)
                                }
                        }
                    }
                }
            }
        }
    }
    signing {
        sign publishing.publications
    }
}

// 生成文档注释
task androidJavadocs(type: Javadoc) {
    // 设置源码所在的位置
    source = android.sourceSets.main.java.srcDirs
}

// 将文档打包成jar,生成javadoc.jar
task androidJavadocsJar(type: Jar) {
    // 指定文档名称
    archiveClassifier.set('javadoc')
    from androidJavadocs.destinationDir
}

// 将源码打包 ,生成sources.jar
task androidSourcesJar(type: Jar) {
    archiveClassifier.set('sources')
    from android.sourceSets.main.java.srcDirs

    exclude "**/R.class"
    exclude "**/BuildConfig.class"
}

//配置需要上传到maven仓库的文件
artifacts {
    archives androidSourcesJar //将源码打包进aar,这样使用方可以看到方法注释.
    archives androidJavadocsJar //将注释打包进aar
}
  1. 在AAR module 的 build.gradle 中引入创建的 publish-mavencentral.gradle。示例如下:
plugins {
    id 'com.android.library'
    id 'kotlin-android'
    id 'kotlin-kapt'
}
// 必须在 android 上面
apply from: '../publish-mavencentral.gradle'

android {
    compileSdkVersion 30
    defaultConfig {
        minSdkVersion 19
        targetSdkVersion 30
        versionCode 1
        // 版本名字直接使用配置的 PUBLISH_VERSION
        versionName PUBLISH_VERSION
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        consumerProguardFiles "consumer-rules.pro"
    }
}
  • sync gradle。
  • 点击开发工具右侧 “Gradle”,如下图 1
  • 编译打包aar,如选图 2,等待编译打包完成。
  • 推送到mavenCentral暂存库,如下图 3
    打包推送aar

6. 发布到mavencentral中央仓库

登录Nexus Repository Manager
输入步骤 1 注册的账号密码
登录

  1. 点击左侧 暂存库,如下图 1 。即可在列表中看到自己推送上来的aar,如果没有,就点击 “Refresh”刷新几次。
  2. 到目前为止,aar还处在暂存库中。如果测试库一切正常后,我们可以勾选上。然后点击 “Close”,如下图 2 。
  3. 稍等片刻后,刷新几次。可以看到状态已改变。再次勾选上,然后点击 “Release”,如下图 3 。发布AAR。
    注意,一旦发布Release版本之后,这个版本就不能被修改删除了,只能再发新版本。这也是合理的,试想你正在使用的版本库,突然被别人删了,那就不好了
    发布

7. 从mavencentral中央仓库依赖使用发布的AAR

好了,我们的aar终于发布完成,可以提供给其他人去使用了。

  1. 在项目根目录 build.gradle 配置:
allprojects {
    repositories {
        google()
        jcenter()
        // 增加mavenCentral中央仓库
        mavenCentral()
    }
}
  1. 在 module 的 build.gradle 配置:
dependencies {
    // 规则就是在 local.properties 中配置的
    // PUBLISH_GROUP_ID:PUBLISH_ARTIFACT_ID:PUBLISH_VERSION
    implementation "io.github.**:**:3.1.0"
}

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

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

相关文章

设计模式之访问者模式

Visitor design pattern 访问者模式的概念、访问者模式的结构、访问者模式的优缺点、访问者模式的使用场景、访问者模式实现示例、访问者模式的源码分析、双分派 1、访问者模式的概念 访问者模式&#xff0c;即在不改变聚合对象内元素的前提下&#xff0c;为聚合对象内每个元素…

STM32F103VET6基于STM32CubeMX RTC时钟报警中断使用示例

STM32F103VET6基于STM32CubeMX RTC时钟报警中断使用示例&#x1f4fa;STM32CubeMX配置RTC时钟报警中断演示过程&#xff1a; &#x1f4cc;相关篇《STM32F103VET6基于STM32CubeMX RTC时钟秒更新中断使用示例》&#x1f4cc;《STM32F103VET6基于STM32CubeMX RTC时钟使用示例》&a…

VUE-router

七.Vue-router 1、什么是vue-router vue-router是vue.js官方路由管理器。vue的单页应用是基于路由和组件的&#xff0c;路由用于设定访问路径&#xff0c;并将路径和组件映射起来。 传统页面切换是用超链接a标签进行切换。但vue里是用路由&#xff0c;因为我们用Vue做的都是…

K8s 前世今生与架构组件简析

k8s 前世 k8s 的前世是google 内部的Borg 系统&#xff0c;是一个作业调度平台&#xff0c;调度的对象是一个个进程。 Borg 本身也利用了容器化技术比如 Cgroups, Namespace 实现应用的隔离。 运行在线上的业务主要分为在线业务&#xff08;prod&#xff09;和离线业务(non-…

Netty实战与源码剖析(二)——Netty线程模型

1 线程模型基本介绍 不同的线程模式&#xff0c;对于程序的性能有很大的影响&#xff0c;Netty为何具有如此高的性能&#xff0c;很大程度上是得益于Netty采用的线程模型。 目前主流存在的线程模型有两种&#xff1a; 传统阻塞IO模型Reactor模型 然而根据Reactor的数量和处理…

零基础转行程序员,有哪些经验可以借鉴?

随着互联网行业的迅速发展&#xff0c;市场对于程序员的需求增大&#xff0c;越来越多的人开始转行到IT领域&#xff0c;程序员也不再基于计算机科学或软件工程等个别专业的毕业生&#xff0c;其他非计算机相关专业的&#xff0c;像学物理、数学、自动化&#xff0c;甚至英语、…

云原生丨DataX在数据迁移中的应用与实践

文章目录一、前言二、准备工作三、安装工具与数据迁移Demo安装工具与数据迁移三、使用Datax抽取移动云上的gauss数据库四、Datax工具逻辑说明整体框架核心模板介绍流程调度数据库类型插件读、写说明五、Datax工具参数说明SettingReader& writerjdbcUrlusernamepasswordtabl…

数据人PK也无人,为什么业务部门的数据需求都是急活?

**导读&#xff1a;**你是不是经常听到数据开发吐槽业务部门&#xff1a;我可以理解业务部门数据需求多&#xff0c;但为什么经常要得这么急呢&#xff1f; 作为一个数据开发者&#xff0c;可以回想一下&#xff0c;当初是怎么进入数据行业的。 是不是也是听一些大V忽悠&…

Java Swing JSlider:滑块组件

在前面的章节中&#xff0c;我们介绍了 Swing 设计简单界面所需的窗口、布局组件以及如何响应事件。Swing 还提供了很多高级组件&#xff0c;如菜单栏、工具栏、文件选择器、表格以及树等。使用这些高级组件可以实现更为复杂的布局&#xff0c;也可以使程序界面更加人性化&…

颜色分析.

介绍 宽光谱光源对许多光学系统都很重要&#xff0c;应用范围包括白光照明、分光计等。Fred中的颜色图像分析&#xff0c;是通过计算每个像素的色度坐标并在表面上显示生成的RGB值来生成颜色分布。此外&#xff0c;FRED还可以显示彩色色度图&#xff0c;并在用户移动光标时指…

CSS -- CSS选择器精讲(基础选择器,符合选择器,属性选择器,结构伪类选择器,伪选择器)

文章目录1 CSS基础选择器1.1 选择器的分类1.2 标签选择器1.3 类选择器1.4 id选择器1.5 通配符选择器1.6 基础选择器总结2 CSS的复合选择器2.1 什么是复合选择器2.2 后代选择器2.3 子选择器2.4 并集选择器2.5 伪类选择器2.6 链接伪类选择器2.7 :focus 伪类选择器2.8 复合选择器总…

正点原子-Linux嵌入式开发学习-第二期04

第十一讲&#xff1a;BSP工程管理 BSP管理其实就是以前学stm32一样的单独为led写.h和.c&#xff0c;并且文件夹有很多种 使用ubuntu的vscode创建bsp文件 第一步&#xff1a;新建bsp文件夹&#xff0c;在bsp文件夹新建各个外设或者功能的文件夹&#xff08;一定是在相应的文件夹…

nodejs+vue+elementui鲜花销售商城管理系统410

前台&#xff1a; (1) 用户注册&#xff1a;用户名&#xff0c;密码&#xff0c;确认密码&#xff0c;邮箱&#xff0c;手机号&#xff0c;真实姓名&#xff0c;收货地址 (2) 用户登录&#xff1a;用户名&#xff0c;密码&#xff0c;验证码 登录后在主页显示欢迎信息&am…

2022年保险行业和产品研究报告

第一章 行业概况 保险业是经营风险的特殊行业。保险是以契约形式确立双方经济关系&#xff0c;以缴纳保险费建立起来的保险基金&#xff0c;对保险合同规定范围内的灾害事故所造成的损失&#xff0c;进行经济补偿或给付的一种经济形式。 保险是专门以风险为经营对象、为人们提…

RK3568开发环境搭建

前面我给大家展示了RK3568的开发板&#xff0c;但是并没有对RK3568的芯片资源进行描述&#xff0c;这里简单给大家看下该芯片的资源&#xff0c;具体的请看瑞芯微官网https://www.rock-chips.com/ 对芯片有了写了解之后&#xff0c;下面就开始搭建开发环境&#xff0c;让我们早…

Databend 开源周报 #72

Databend 是一款强大的云数仓。专为弹性和高效设计&#xff0c;自由且开源。 即刻体验云服务&#xff1a;https://app.databend.com。 What’s New 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 Features & Improvements Multiple Catalogs …

操作系统:虚拟存储器 练习题(带有答案和解析)

文章目录1.虚拟存储器概述1.1.常规存储管理方式的特征和局部性原理1.2.虚拟存储器的定义和特征1.3.虚拟存储器的实现方法2.请求分页存储管理方式2.1.请求分页中的硬件支持2.2.请求分页中的内存分配3.页面置换算法3.1.最佳置换算法和先进先出置换算法3.2.最近最久未使用和最少使…

Spring事件处理

在实际业务开发中&#xff0c;有时候复杂性的业务之间需要解耦&#xff0c;常用的方法&#xff1a;同步、异步、MQ。但 MQ 重啊&#xff0c;非必要不提升架构复杂度。 针对同步和异步使用方式&#xff1a;&#xff11;.定时器 &#xff12;.Spring Event. Spring Event: 观察者…

网站反爬指南:政府网站篇

目录 前言 黑灰产为何盯上政务网站&#xff1f; 如何反爬&#xff1f; 前言 网络爬虫正在成为政务网站们最大的威胁之一。 随着网络安全被提升到国家层面&#xff0c;网站安全管理和防护日趋重要&#xff0c;政务网站既要确保网站信息的及时和准确&#xff0c;又要能应对网络…

15. Spring事务管理

1. Spring事务简介 事务作用&#xff1a;在数据层保障一系列的数据库操作同成功同失败Spring事务作用&#xff1a;在数据层或**业务层**保障一系列的数据库操作同成功同失败 2. 案例 2.1 需求和分析 需求&#xff1a;实现任意两个账户间转账操作需求微缩&#xff1a;A账户减…