发布Android Lib库(Jar、AAR、SO)到Maven Central

发布Android Lib库(Jar、AAR、SO)到Maven Central

  • 注册Sonatype账号
  • 创建Project工单
  • 开通仓库
  • 创建GPG签名
    • 下载GPG
    • 创建GPG密钥
    • 将密钥上传到GPG服务器
    • 导出私钥
  • 准备脚本和上传资源
    • Maven上传脚本的编写
    • GPG签名配置
    • Maven上传资源一览
      • Jar包资源
      • AAR资源
    • 生成JavaSource
    • 生成JavaDoc
      • Java项目生成Doc方式
      • Kotlin项目生成DOC
    • 配置主包资源
      • 主包是AAR包
      • 主包是Jar包
    • 补充:生成虚拟JavaSource和JavaDoc包
  • 部署AAR或Jar到Maven Central
  • 发布
  • 扩展:部署So库到Maven的方式
  • 扩展:Maven Central手动部署并发布方法
    • 准备pom文件
    • 准备资源包
    • 签名
    • 打包bundle
    • 上传
    • Release

转载请注明出处:https://blog.csdn.net/xiaozeiqwe/article/details/117379335

更新注明:此文章在编写的时候使用的Gradle版本为5.6.4,如果是比较高版本的Gradle,那么可能会出现一些错误,所以在这边放上最新版本的可以正常编译通过的Demo,并对之前的代码进行更新,使得在高版本的Gradle上也可以正常编译,主要修改点在Java项目生成Doc方式这一节里面,大家可以去查看一下
Gradle5.6.4 Demo:https://github.com/xiaozeiqwe8/MavenJavaDemo5.4.6

本文主要以Gradle Maven-Publish插件的方式进行发布到Maven Central的流程进行说明,附带了手动发布的流程、so库的发布流程、不上传源码和doc的发布流程,并提及说明了发布Jar包和发布aar包的不同方式、Java与Kotlin版本的不同打包方式。

注册Sonatype账号

Sonatype公司是负责维护Maven Central的,他们使用Sonatype Nexus Repository Manager 这个产品来管理Maven中央仓库,所以我们要使用Maven Central的话,首先需要注册Sonatype账号。

注册地址:https://issues.sonatype.org/secure/Dashboard.jspa,点击Sign up进行注册
发布Android Lib库(Jar、AAR、SO)到Maven Central_第1张图片

  • Email: 邮箱帐号,在 Sonatype 上的相关操作,会通知到这个邮箱帐号
  • Full name: 填写联系人名称
  • Username: Sonatype 的登录帐号
  • Password: 登录密码,要求至少8位,并带有大小写字母和字符

创建Project工单

注册完成后,就可以进行登录了,登录进去后,可以发现,他其实是一个JIRA系统,在这个系统中,我们需要创建一个Ticket,用来申请我们自己的Group Id,这个Group Id熟悉maven的应该都了解,可以看成我们自己库的顶级域名,可以用它来和artifactId以及version组合,简称GAV,来定位到我们的某个版本的资源。

点击Create来创建一个Ticket
发布Android Lib库(Jar、AAR、SO)到Maven Central_第2张图片
发布Android Lib库(Jar、AAR、SO)到Maven Central_第3张图片

  • Project: 选择 Community Support - Open Source Project
  • Repository Hosting (OSSRH)
  • Issue Type: 选择 New Project
  • Summary: 可填写jar 包名称
  • Description: 描述信息
  • Group Id: Group Id的命名规则为一个域名的反向名称,,可以采用io.github.[username]的方式,比如我上面填写的io.github.xiaozeiqwe8。
    这边可填写的内容会有2种选择,一种是使用自己的域名,另一种就像我上面填写的那样,使用github仓库地址,这里推荐使用自己的github仓库地址作为Group Id,因为这个会影响到后面工作人员要求验证的方式的不同,验证起来会方便些。
    另外,如果使用的是github地址,需要注意的是需要使用io.github而不是com.github,如果你是用com,工作人员会要求你修改,并会附上这个文档让你查看原因https://central.sonatype.org/changelog/#2021-04-01-comgithub-is-not-supported-anymore-as-a-valid-coordinate
  • Project URL: 项目地址,可以是github仓库地址,也可以是官网地址
  • SCM URL: 项目的 Git 地址

填写完成这些信息后,就可以create了,create完成后,你的单子会自动assign给工作人员
发布Android Lib库(Jar、AAR、SO)到Maven Central_第4张图片

开通仓库

工作人员会根据你填写的GroupId的方式,来要求你配合完成一些验证,会在comments里面回复你,在这边,我只说明github的验证方式,域名方式则可自行百度查看验证方式。
发布Android Lib库(Jar、AAR、SO)到Maven Central_第5张图片

然后要求我们在自己的github账号里创建一个public的名称为你这个Ticket的repository,很简单,直接创建一个,注意 Repository名称以及权限是public即可
在这里插入图片描述

发布Android Lib库(Jar、AAR、SO)到Maven Central_第6张图片

这样就完成了,然后我们就可以立马去刚刚的Ticket的comments里面告诉工作人员,我们已经完成了这一步
发布Android Lib库(Jar、AAR、SO)到Maven Central_第7张图片

接下来的步骤,我们就是等待了,等待工作人员回复完成即可进行下一步了,我在这一步等待的时间很快,应该不到半小时,至于为什么要等待,可以查看官网的解释https://central.sonatype.org/faq/a-human/

发布Android Lib库(Jar、AAR、SO)到Maven Central_第8张图片
等待到结果会像这样,这时候,我们也不忘谢谢工作人员。

到这一步,我们的Maven仓库就已经可以使用了,使用这个地址进行登录https://s01.oss.sonatype.org,用户名密码就是你上面注册的工单系统的账密,接下来我们就可以准备我们需要上传的库了。

创建GPG签名

GPG签名主要是为了给需要发布到maven central的包进行签名,每个发布上去的包都需要进行这个操作,为了接下来我们可以直接使用,我们所以我们先创建一个自己的GPG签名。关于GPG的概念,大家可以自行学习。

下载GPG

可以从以下地址进行下载:http://www.gnupg.org/download/
发布Android Lib库(Jar、AAR、SO)到Maven Central_第9张图片

下载完成后,进行安装,默认都下一步即可完成。

安装完成后,在命令行中,可以查看一下版本,来确认环境以及安装是否成功
发布Android Lib库(Jar、AAR、SO)到Maven Central_第10张图片

创建GPG密钥

这一步我们就可以开始创建GPG密钥了,有两种方式可以生成密钥,一种是通过kleopatra桌面管理程序来生成,另一种是通过CMD来生成,这边我推荐通过命令行来生成密钥,因为我的kleopatra始终都无法打开,如下图:
在这里插入图片描述

所以我这边就使用命令行的方式生成,流程也不复杂

使用命令

gpg --gen-key

來進行,

发布Android Lib库(Jar、AAR、SO)到Maven Central_第11张图片

选择default即可,直接回车或输入1
在这里插入图片描述

默认2048即可

发布Android Lib库(Jar、AAR、SO)到Maven Central_第12张图片

这边我们设置沒有过期时间,直接回車

在这里插入图片描述

输入y

在这里插入图片描述

要求输入一个Real name,要大于五个字符

发布Android Lib库(Jar、AAR、SO)到Maven Central_第13张图片

在输入一个邮箱,comment可以不填,输入O來确认

在这里插入图片描述

最后需要给密钥设置一个密码

发布Android Lib库(Jar、AAR、SO)到Maven Central_第14张图片

创建成功,我们这边的密钥指纹是77D1 40D6 A015 4401 32C8 AC53 B440 6F47 CCA2 0382,它的后8位CCA20382,我们接下来就可以通过他来进行一些查询操作。

另外需要说明的是,如果是使用linux进行操作,如果使用gpg --gen-key命令没有要求输入很多信息,这样出来的证书默认是2年的有效期限的,所以我们可以使用

gpg --full-generate-key

来生成,这样会要求我们输入很多信息了。

创建成功后,我们可以使用gpg --list-keys来查询所有本地生成的key列表
发布Android Lib库(Jar、AAR、SO)到Maven Central_第15张图片

将密钥上传到GPG服务器

接下来我们还需要将我们生成的密钥上传到GPG服务器,这样做是为了Maven仓库到时候可以从GPG服务器上拿到我们的密钥对我们上传的包进行验证。

注意:下面的hkp://pool.sks-keyservers.net已经被弃用了(具体详情可以查看https://sks-keyservers.net/overview-of-pools.php),所以请替换成其他的GPG服务器仓库来使用,推荐使用hkp://keyserver.ubuntu.com
另外也可以查看官方说明的仓库来使用https://central.sonatype.org/publish/requirements/gpg/#distributing-your-public-key

上传的命令

gpg --keyserver hkp://pool.sks-keyservers.net --send-keys CCA20382
  • keyserver固定填写该地址即可,当然也可以选择其他的keyserver,我们这边只用主池就可以,具体也可以参考这个列表来查看:https://sks-keyservers.net/overview-of-pools.php 已废弃

  • send-keys使用我们上面生成的密钥指纹的后8位
    在这里插入图片描述

然后我们可以查询一下是否可以查询到我们上传的key,只有能查询到才代表上传成功
查询命令:

gpg --keyserver hkp://pool.sks-keyservers.net --search-keys CCA20382

在这里插入图片描述

key上传到主池后,会同步到其他key池,不过这个同步的时间就说不准了,可能会很久,不过不影响我们的使用,因为验证key的时候,maven会去很多key池里面查找,找到一个就可以进行验证,另外,如果是有上传不了主key的同学也可以试一下使用这个地址进行上传hkp://keys.gnupg.net,我在尝试的时候,感觉这个池生效要来得快一些,并且这个池可以直接去网页上进行查询,地址:http://keys.gnupg.net/
输入你的key id或者是username都可以很快的进行查询。

导出私钥

接下来我们还需要导出我们生成的key的私钥,以便在maven插件里面使用
使用命令:

gpg -o /e/secring.gpg --export-secret-keys CCA20382

这边指定输出到e盘,并指定我们要导出的Key Id,导出后,上传的时候会用到。

准备脚本和上传资源

上传的方式有很多种,具体可以查看官网上提供的5种方式:
https://central.sonatype.org/publish/publish-guide/#deployment

这边我们使用Gradle上传的方式,因为对于android开发来说,Gradle相对比较熟悉一些。

Gradle的方式主要是使用Gradle提供的Maven-Publish插件进行上传,手动上传方式会在最后补充

Maven上传脚本的编写

我们可以先把根目录下的jcenter()注释掉,改成使用mavenCentral(), 原因大家都知道吧,Google也已经明确指出了“JCenter is at end of life“,

发布Android Lib库(Jar、AAR、SO)到Maven Central_第16张图片
不过这个步骤其实和我们的上传没关系,只是想把JCenter给注释掉

发布Android Lib库(Jar、AAR、SO)到Maven Central_第17张图片

首先,我们打开要上传的lib module里的build.gradle,增加apply maven插件

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

然后我们在build.gradle里添加maven publish脚本
其脚本为:

publishing {
    publications {
        maven(MavenPublication) {
            groupId 'io.github.xiaozeiqwe8' //开通maven central时候定义的
			artifactId 'dialog-lib' //资源名称
			version '0.9.4' //版本名称
			pom {
				name = 'dialog-lib'
				description = 'dialog lib'
				url = 'https://github.com/xiaozeiqwe8/DialogLib'
				inceptionYear = '2021'
			
				scm {
					url = 'https://github.com/xiaozeiqwe8/DialogLib'
					connection = 'scm:git@https://github.com/xiaozeiqwe8/DialogLib.git'
					developerConnection = 'scm:git@https://github.com/xiaozeiqwe8/DialogLib.git'
				}

				licenses {
					license {
						name = 'The Apache Software License, Version 2.0'
						url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
						distribution = 'repo'
						comments = 'A business-friendly OSS license'
					}
				}

				developers {
					developer {
						id = 'xiaozei'
						name = 'karl'
						email = 'xiaozeiqwe8@163.com'
						url = 'https://github.com/xiaozeiqwe8/DialogLib'
					}
				}

				issueManagement {
					system = 'Github'
					url = 'https://github.com/xiaozeiqwe8/DialogLib'
				}
			}
			artifact generateSourcesJar //需要上传的source jar
            artifact generateJavadoc //需要上传的java doc
			artifact makeJar //需要上传的资源jar路径或者是aar路径,这边可以填写一个生成jar的task,如makeJar方法就是一个生成jar的task
		}
    }
    repositories {
        maven {
            // 指定要上传的maven仓库
            url = 'https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/'
            //Maven仓库用户名和密码
            credentials {
                username 'xiaozeiqwe8'
                password password
            }
        }
    }
}
signing {
    sign publishing.publications.maven //签名配置
}

上面的配置中,有几项需要单独说明

  • groupId和artifactId基本上不需要变动,除非资源的变动,否则每次上传时只需要变动version即可。
  • artifact后面可以直接跟相对路径或者绝对路径,也可以是一个task,但是需要保证该task的type类型为jar或者是maven支持的类型,否则会报错
  • 如果是上传aar的话,artifact可以只有1个aar包,但是如果是上传jar包,需要指定jar包,java source,java doc三者缺一不可,maven会在release的时候进行验证。
  • 仓库地址这边指定的是staging仓库,该仓库用来作为发布之前的一个确认,我们上传的包会先进入这个仓库,然后经过了maven的验证和我们自己的验证,最终release到真正的release仓库。另外还有一个SNAPSHOT仓库,仓库地址是:https://s01.oss.sonatype.org/content/repositories/snapshots/,这是一个快照仓库,它是一个存放开发版本的仓库,可以把它看做是测试用的,基本上我们会在我们的version后面带上-SNAPSHOT来表示该包是一个开发版本。另外,如果要使用SNAPSHOT仓库的话,我们需要在根目录的build.gradle里面加上
maven { url 'https://s01.oss.sonatype.org/content/repositories/snapshots/'}

接下来,建议可以将上面的这些属性值,把它抽离出来使用,这样就可以避免每次都要去修改build.properties,我们可以将这些值定义在gradle.properties中,这样全局都可以使用,如下:
在gradle.properties里面定义:

GROUP_ID=io.github.xiaozeiqwe8
ARTIFACT_ID=vox-sdk
VERSION_NAME=0.9.2-SNAPSHOT
.....
.....

然后在build.gradle中的maven配置中就可以使用下面的写法:

maven(MavenPublication) {
    groupId GROUP_ID
    artifactId ARTIFACT_ID
    version VERSION_NAME
}

这样,就可以将配置参数和脚本分离开来。

GPG签名配置

GPG签名需要我们在gradle.properties里面增加三个属性值:

signing.keyId=AC6197AE
signing.password=11111111
signing.secretKeyRingFile=../secring.gpg

这边的keyId和password就是我们之前GPG生成的时候自己输入的,这边的secretKeyRingFile就是我们导出的gpg私钥,我们可以将其放在工程下,同时可以在ignore文件中忽略它的Git提交,并且gradle.properties文件也建议忽略掉,这样我们的密码只在本地就降低了泄漏的风险。

补充:我们上一步中,如果已经从maven脚本中,将配置参数分离到gradle.properties里面的话,其实我们还可以将敏感信息和maven配置参数分离,不要都放在gradle.properties里面,这样做的好处是我们可以提交maven的properties文件配置参数,但是maven账号密码和gpg的签名配置我们可以不用提交。

我们可以新建一个maven.properties文件,然后将gradle.properties里面抽离maven的基本配置(即除了敏感参数以外的所有配置)到maven.properties里面,然后在build.gradle里面引入:

Properties properties = new Properties()
properties.load(project.rootProject.file('maven.properties').newDataInputStream())

//定义properties
def GROUP_ID = properties.getProperty('GROUP_ID')
def ARTIFACT_ID = properties.getProperty('ARTIFACT_ID')
def VERSION_NAME = properties.getProperty('VERSION_NAME')
def .............
def .............

这样,我们的maven中的脚本就可以不需要修改,从而实现了配置参数的分离。

maven.properties内容:

GROUP_ID=io.github.xiaozeiqwe8

ARTIFACT_ID=dialog-lib
POM_PACKAGING=jar

#ARTIFACT_ID=dialog-lib
#CUSTOM_ARTIFACT=./build/outputs/aar/dialogLibs-release.aar
#POM_PACKAGING=aar

VERSION_NAME=0.9.6+1.0.2

POM_NAME=dialog-lib
POM_URL=https://github.com/xiaozeiqwe8/DialogLib
POM_DESCRIPTION=dialog lib

POM_SCM_URL=https://github.com/xiaozeiqwe8/DialogLib
POM_SCM_CONNECTION=scm:git@https://github.com/xiaozeiqwe8/DialogLib.git
POM_SCM_DEV_CONNECTION=scm:git@https://github.com/xiaozeiqwe8/DialogLib.git

POM_LICENCE_COMMENTS=A business-friendly OSS license
POM_LICENCE_NAME=The Apache Software License, Version 2.0
POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt
POM_LICENCE_DIST=repo

POM_DEVELOPER_ID= xiaozei    #自行填写开发者id
POM_DEVELOPER_NAME= karl   #自行填写开发者姓名
POM_DEVELOPER_EMAIL= xiaozeiqwetw@gmail.com   #自行填写开发者邮箱
POM_DEVELOPER_URL=https://github.com/xiaozeiqwe8/DialogLib
POM_ISSUE_MANAGEMENT_SYSTEM=Github
POM_ISSUE_MANAGEMENT_URL=https://github.com/xiaozeiqwe8/DialogLib
POM_INCEPTION_YEAR=2021

#将以下信息拷贝到gradle.properties中填写,不提交gradle.properties文件,保证敏感数据的安全
#MAVEN_USERNAME=
#MAVEN_PASSWORD=

#signing.keyId=
#signing.password=
#signing.secretKeyRingFile=

Maven上传资源一览

Jar包资源

Jar包的上传需要带以下内容
发布Android Lib库(Jar、AAR、SO)到Maven Central_第18张图片

这三组是我们需要最终生成出来的,分别是
dialog-lib.jar, dialog-lib.jar.asc
dialog-lib-javadoc.jar, dialog-lib-javadoc.jar.asc
dialog-lib-sources.jar, dialog-lib-sources.jar.asc

asc后缀的包我们会通过sign插件自动生成出来,而除了这三组以外,其实还需要一组pom后缀的文件和asc,这个文件我们使用Gradle Maven-Publish插件其内部会给我们自动生成,所以我们不需要关心它。

接下来的步骤中,我们就会来生成我们需要关心的dialog-lib.jar,dialog-lib-javadoc.jar,dialog-lib-sources.jar

AAR资源

AAR包的上传资源只需要准备aar包即可,其他部分插件内部都会帮我们生成,并且不需要单独生成javasource和javadoc。

生成JavaSource

如果上传的资源是AAR,这一步可以跳过

生成JavaSource的话,可以使用下面的脚本:

task generateSorceJar(type: Jar) {
    archiveClassifier.set( 'sources')
    from sourceSets.main.java.srcDirs
}

其中,archiveClassifier.set( ‘sources’) 可以不指定,但是如果不指定,默认打出来的jar包的名称默认是模块名称,所以我们指定Classifier后,相当于是打了一个分包,jar包名称会变成[moduleName]-sources这样,正好符合我们上传的包名称,并且这个task像上面说的是可以直接作为artifact的参数来用的。

执行该task,打出来的包会在build/libs下
发布Android Lib库(Jar、AAR、SO)到Maven Central_第19张图片

生成JavaDoc

如果上传的资源是AAR,这一步可以跳过

生成JavaDoc的方式会有点麻烦,因为Kotlin需要借助到一个插件dokka才能实现生成出来的像JavaDoc一样的帮助文档,而Java在使用上会有一个坑,下面会分别说一下Java和Kotlin的生成方式:

Java项目生成Doc方式

module目录下的build.gradle下,在android作用域下添加task:

task javadoc(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) + configurations.compile
}

配置编码为UTF-8以支持中文

javadoc {
    options {
        encoding "UTF-8"
        charSet 'UTF-8'
        author true
        version true
        links "http://docs.oracle.com/javase/8/docs/api"
    }
}

在dependencies下添加:

dependencies {
    compile 'com.android.support:support-annotations:28.0.0'
}

Update: 这边推荐使用高版本的写法,这样可以保证在Gradle7下也能正常编译
主要修改是在build.gradle开头加入configurations { javadocDeps } 将configurations.compile修改成configurations.javadocDeps dependencies中加入javadocDeps ‘com.android.support:support-annotations:28.0.0’`

`

添加这个是为了能够让java doc可以认识androidx.annotation包下的class,如果不加这个,并且你的代码中有使用到了一些annotation下的内容,如@NonNull注解,则会报错,生成失败。

添加完成同步后,就可以执行javadoc task,会在.build文件夹下生成docs
发布Android Lib库(Jar、AAR、SO)到Maven Central_第20张图片

然后添加我们的generateJavadoc的task

task generateJavadoc(type: Jar, dependsOn:['javadoc']) {
    group = 'jar'
    archiveClassifier.set('javadoc')
    from 'build/docs/javadoc'
}

Kotlin项目生成DOC

module下的build.gradle内,增加引用dokka的配置:

plugins {
    id 'com.android.library'
    id 'kotlin-android'
    id("org.jetbrains.dokka") version ("1.4.32")
}

这边直接指定了版本为1.4.32,官方文档可以参考这个:https://kotlin.github.io/dokka/1.4.32/user_guide/gradle/usage/

在dependencies 增加:

dependencies {
	dokkaPlugin("org.jetbrains.dokka:kotlin-as-java-plugin:1.4.32")
}

然后我们可以再配置一个生成路径,默认如果不配置则是在
build/dokka/javadoc下:

tasks.named("dokkaJavadoc") {
    outputDirectory.set(new File("$rootDir/javadoc"))
}

到这一步,就可以生成了,可以选择task执行:
发布Android Lib库(Jar、AAR、SO)到Maven Central_第21张图片

在生成的过程中,默认程序会去连android获取package-list,这一步如果没有VPN的话,需要等待它全部重试完才行,像这样
发布Android Lib库(Jar、AAR、SO)到Maven Central_第22张图片

虽然最后能编译通过,但是太耗费时间,为了解决这个问题,我们可以增加配置,让其不去获取该package-list

dokkaJavadoc {
    dokkaSourceSets {
        configureEach { // Or source set name, for single-platform the default source sets are `main` and `test`
            // Disable linking to online kotlin-stdlib documentation
            noStdlibLink.set(true)
            // Disable linking to online JDK documentation
            noJdkLink.set(true)
            // Disable linking to online Android documentation (only applicable for Android projects)
            noAndroidSdkLink.set(true)
        }
    }
}

最后,我们需要将javadoc打成jar包,以供maven脚本上传使用,我们可以写个task来做这个事情,这样打出来的jar包名称也是符合我们上传要求的:

task generateJavadoc(type: Jar, dependsOn: dokkaJavadoc) {
    group = 'jar'
    archiveClassifier.set('javadoc')
    from "$rootDir/javadoc"
}

配置主包资源

主包是AAR包

需要上传的包如果是AAR包,则直接在maven的publish脚本中配置artifact 参数的路径为aar的路径即可,如配置

artifact  './build/outputs/aar/dialogLibs-release.aar'

主包是Jar包

Maven的配置里面,我们可以直接指定需要上传的Jar的路径即可,我们可以在 build/intermediates/aar_main_jar/release/classes.jar 找到我们的编译后产生的jar包。

另外我们也可以像上面配置的一样,使用一个task直接指定到artifact参数上,就和javadoc和javasource一样,这也是推荐的做法,我们的task可以这样写:

task generateMergeJar(type: Jar, dependsOn:['assembleRelease']){
    group = 'jar'
    from(project.zipTree('build/intermediates/aar_main_jar/release/classes.jar'))
}

这边需要注意的是,这边我们是需要打一个主包,所以这边生成出来的jar名称,未指定classifier,这种情况下的jar默认会是和你的module名称一致的,这样在上传到maven后,在真正使用的时候Android Studio才能够正确的识别到这个jar包,如果你的artifactId和你的Module名称不一致,需要你自己去将这个jar包的名称修改成一致的才行,否则可能会造成你上传的资源最终Android Studio即使下载依赖了也认不到。

我在测试下来发现,如果你带的是真实的javadoc和javasource,并且javadoc和javasource的包名和artifactId对得上,那么上传上去的主名称即使不和artifactId一致,也会自动为你修改,但是如果是虚拟的javadoc和javasource或者这2个的名称也是随意的,那就不会自动帮你修改。

另外,这样做有一个好处是你可以将其他的jar也合并进来,组成一个jar包上传上去,只需要再加一个from即可,这可以将你的一些资源比如so库一起打进去上传到Maven Central上。

补充:生成虚拟JavaSource和JavaDoc包

这一步是为了如果有些库因为特殊原因不能上传JavaSource或JavaDoc的,可以使用虚拟的source包和doc包,也是可以通过maven的验证的,不过官方上当然是不推荐这样做

我们可以在根目录下新建一个javasource的目录,然后在里面新建一个空的README文件,像这样:
发布Android Lib库(Jar、AAR、SO)到Maven Central_第23张图片

然后我们就可以使用下面的task来打这个虚拟jar包:

task generateSorceJar(type: Jar) {
    //dummy doc
    group = 'jar'
    archiveClassifier.set( 'sources')
    from "$rootDir/mavenwork/javasource"
}

同样,我们直接将这个task作为artifact的value即可,同理JavaDoc也是一样处理,最终我们会有3个artifact的配置在Maven脚本中:
发布Android Lib库(Jar、AAR、SO)到Maven Central_第24张图片

部署AAR或Jar到Maven Central

这一步做完后我们就可以使用publish命令进行上传了
发布Android Lib库(Jar、AAR、SO)到Maven Central_第25张图片

等待task执行成功后,去Maven Central的https://s01.oss.sonatype.org/#stagingRepositories
仓库中查看
发布Android Lib库(Jar、AAR、SO)到Maven Central_第26张图片
发布Android Lib库(Jar、AAR、SO)到Maven Central_第27张图片

在这一步,可以下载jar包或者是doc之类的文件进行验证正确性,如果有问题,可以点击Drop删除掉这个版本的信息后,再重新上传。

发布

最终都没问题后,就可以进行release了,release的步骤是直接点击Close按钮,点击Confirm
发布Android Lib库(Jar、AAR、SO)到Maven Central_第28张图片

这时候,maven仓库会进行验证,等待验证完成后,Refresh一下,即可出现Release按钮:
发布Android Lib库(Jar、AAR、SO)到Maven Central_第29张图片

点击Release,Confirm后,即完成发布流程。
发布完成后,可以到https://s01.oss.sonatype.org/#welcome页面输入你的GroupId进行查看:
在这里插入图片描述
注意:这边查看到了不代表立马就能在Android Studio中引用到,一般需要等待一会儿时间,这个时间我这边基本上10分钟以内可以完成。

我们可以通过这个网站来查看你发布的库有没有同步到maven中央仓库:https://repo1.maven.org/maven2/
发布Android Lib库(Jar、AAR、SO)到Maven Central_第30张图片
查到发布的版本后,接下来的步骤,就是在Android Studio中引用啦,使用GAV进行资源定位:

dependencies {
    implementation 'io.github.xiaozeiqwe8:dialog-lib:0.9.4'
}

扩展:部署So库到Maven的方式

如果需要将So库也引入依赖,我们可以采用将so库打成一个jar包,然后上传到maven的方式来实现,这个jar包需要有固定的包目录结构,才能被最终打入apk的正确路径下,查看apk的so存放路径,我们可以发现
发布Android Lib库(Jar、AAR、SO)到Maven Central_第31张图片
其最终会被打入lib目录下,所以我们的so打的jar包,只要是这个目录格式,最后在打包成apk的时候,也会将so打入该目录下,并且可以被引用到,利用这一点,我们来打so库

在项目下新建一个soLibs目录,并在其下层新建lib目录,然后将so根据架构名称分文件夹全部放入其中
发布Android Lib库(Jar、AAR、SO)到Maven Central_第32张图片

编写task:

task generateSoJar(type: Jar) {
    group = 'jar'
	archiveClassifier.set( 'so')
    from('../soLibs/')
}

然后修改generateMergeJar的task

task generateMergeJar(type: Jar, dependsOn:['assembleRelease','generateSoJar']){
    group = 'jar'
    from(project.zipTree('build/libs/aiengine-so.jar'))
    from(project.zipTree('build/intermediates/aar_main_jar/release/classes.jar'))
}

这样,我们就完成了将so和我们的jar合并在一起,并可以直接通过maven脚本上传的功能。

扩展:Maven Central手动部署并发布方法

准备pom文件

新建一个后缀名为pom的文件,其内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<modelVersion>4.0.0</modelVersion>
	<groupId>io.github.xiaozeiqwe8</groupId>
	<artifactId>dialog-lib</artifactId>
	<version>0.9.6+1.0.2</version>
	<name>dialog-lib</name>
	<description>dialog lib</description>
	<url>https://github.com/xiaozeiqwe8/DialogLib</url>
	<inceptionYear>2021</inceptionYear>
	<licenses>
		<license>
			<name>The Apache Software License, Version 2.0</name>
			<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
			<distribution>repo</distribution>
			<comments>A business-friendly OSS license</comments>
		</license>
	</licenses>
	<developers>
		<developer>
			<id>xiaozei</id>
			<name>karl</name>
			<email>xiaozeiqwe8@163.com</email>
			<url>https://github.com/xiaozeiqwe8/DialogLib</url>
		</developer>
	</developers>
	<scm>
		<connection>scm:git@https://github.com/xiaozeiqwe8/DialogLib.git</connection>
		<developerConnection>scm:git@https://github.com/xiaozeiqwe8/DialogLib.git</developerConnection>
		<url>https://github.com/xiaozeiqwe8/DialogLib</url>
	</scm>
	<issueManagement>
		<system>Github</system>
		<url>https://github.com/xiaozeiqwe8/DialogLib</url>
	</issueManagement>
</project>

这个Pom文件中的内容基本上与在Gradle插件中配置的一样,这边不再描述

准备资源包

资源包一样分为主包,javadoc,sources这三个jar包,其命名方式为[artifactId]-[version]-[分包名称].jar,如下图:
在这里插入图片描述
提示:这边的javadoc和sources一样可以用虚拟创建的

签名

这样我们就有了4个文件,分别对这4个文件进行签名,使用gpg命令:

gpg -abu CCA20382 dialog-lib-0.9.6+1.0.2.jar

签名完成后,我们得到了所有的8个文件
发布Android Lib库(Jar、AAR、SO)到Maven Central_第33张图片

打包bundle

使用命令:

jar -cvf bundle.jar dialog-lib-0.9.6+1.0.2.jar dialog-lib-0.9.6+1.0.2.jar.asc dialog-lib-0.9.6+1.0.2-javadoc.jar dialog-lib-0.9.6+1.0.2-javadoc.jar.asc dialog-lib-0.9.6+1.0.2-sources.jar dialog-lib-0.9.6+1.0.2-sources.jar.asc dialog-lib-0.9.6+1.0.2.pom dialog-lib-0.9.6+1.0.2.pom.asc

生成出来bundle.jar后我们就可以进行上传了

上传

进入https://s01.oss.sonatype.org/#staging-upload,选择UploadMode为Artifact Bundle,点击Select Bundle to Upload选择你本地需要上传的包
发布Android Lib库(Jar、AAR、SO)到Maven Central_第34张图片

然后点击Upload Bundle,等待进度条完成上传
发布Android Lib库(Jar、AAR、SO)到Maven Central_第35张图片

Release

上传完成的包会自动进行Close的操作,即自动验证这个包,所以可以直接进行Release的步骤,Release的步骤和第7步一致。

你可能感兴趣的:(android,maven,jar,gradle,kotlin)