如何高效发布Android AAR包到远程Maven仓库
本文同步发布于公众号:移动开发那些事如何高效发布Android AAR包到远程Maven仓库
1 背景
在Gradle 7.0之前的版本中,maven插件是发布AAR包到远程Maven仓库的主要工具。但从Gradle 7.0开始,maven插件被废弃,官方推荐使用maven-publish插件。本文将介绍如何使用这两种插件高效发布AAR包。
2 maven插件
使用maven插件的前提是对应工程的的Gradle的版本要小于7.0,如:
buildscript {
dependencies {
// 这里使用3.5.0版本
classpath 'com.android.tools.build:gradle:3.5.0'
}
}
2.1 上传脚本制作
maven插件的使用也比较简单,只需要在对应module下编写对应的gradle脚本就可以,笔者一般喜欢新建一个gradle文件来写相关的脚本,新建一个upload.gradle的脚本
apply plugin: 'maven'
def getRepositoryUsername() {
return "stringwu"
}
def getRepositoryPassword() {
// 要上传的仓库的密码,按需改为实际的
return "abcdemoabc"
}
uploadArchives {
repositories {
mavenDeployer {
// 这里远程仓库的地址需要改为实际要发布的地址
repository(url: "https://repo1.maven.org/maven2/") {
authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
}
snapshotRepository(url: "https://repo1.maven.org/maven2/snapshot") {
authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
}
pom.groupId = "com.demo.abcsdk"
pom.artifactId = "abcsdk"
// 版本
def version = "0.0.1"
// 判断是否是release版本,非release版本自动在版本号后面加个SNAPSHOT
if (System.getenv('isRelease') && Boolean.valueOf(System.getenv('isRelease'))) {
pom.version = version
} else {
if (System.getenv('buildID')) {
version = version + "." + System.getenv('buildID')
}
pom.version = version +
"-SNAPSHOT"
}
}
}
}
这里有个点需要留意的是maven插件会自动根据版本号是否带SNAPSHOT 后缀来决定发布到哪个远程仓库(版本号带SNAPSHOT 会发布到snapshotRepository仓库,否则发布到repository仓库)
2.2 发布
在编写完对应的上传脚本后,就需要在对应的module的build.gradle文件里引用前面编写好的脚本:
apply from: 'upload.gradle'
android {
buildTypes {
release {
minifyEnabled false
proguardFiles 'proguard-rules.pro'
}
debug {
minifyEnabled false
}
}
}
.....
在搞定了这些后,我们就只需要在命令行执行gradle uploadArchives 就可以把对应的AAR包发布到远程仓库了,如果需要在上传前处理一些额外的逻辑,也可以把相关的逻辑封装成shell脚本。
3 maven-publish插件
使用maven-publish插件的前提是对应工程的的Gradle的版本要大于7.0,如:
buildscript {
ext {
kotlin_version = '1.4.10'
}
dependencies {
// gradle的版本要大于7.0,这里使用7.1.2
classpath 'com.android.tools.build:gradle:7.1.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
3.1 上传脚本制作
maven-publish插件的使用也比较简单,只需要在对应module下编写对应的gradle脚本就可以,笔者一般喜欢新建一个gradle文件来写相关的脚本,新建一个upload.gradle的脚本
apply plugin: 'maven-publish'
static def getRepositoryUsername() {
// 要上传的仓库的用户名 按需改为实际的
return "stringwu"
}
static def getRepositoryPassword() {
// 要上传的仓库的密码,按需改为实际的
return "abcdemoabc"
}
task sourcesJar(type: Jar) {
from android.sourceSets.main.java.srcDirs
classifier = 'sources'
}
// 上传相关的脚本
publishing {
repositories {
maven {
// 这里远程仓库的地址需要改为实际要发布的地址
def releaseUrl = "https://repo1.maven.org/maven2/"
def snapshotUrl = "https://repo1.maven.org/maven2/snapshot"
// 这里去拿系统变量:isRelease 来决定要发布到哪个地址,可省略
if (System.getenv('isRelease') && Boolean.valueOf(System.getenv('isRelease'))) {
url = releaseUrl
} else {
url = snapshotUrl
}
// 身体信息
credentials {
username getRepositoryUsername()
password getRepositoryPassword()
}
}
}
publications {
release(MavenPublication) {
// eg:com.demo.a
groupId = project.MAVEN_GROUP
// eg : sdkA
artifactId = project.UPLOAD_ARCHIVES_MODULE_ONE
// 版本
def tmpVersion = project.MAVEN_VERSION
// 如果系统变量有,就用系统变量里设置的
if (System.getenv('VERSION_NAME')) {
tmpVersion = System.getenv('VERSION_NAME')
}
version = tmpVersion
// 要上传的aar包
artifact("$buildDir/outputs/aar/*.aar")
// 同时打包上传jar source 可省略
artifact(sourcesJar)
// 这一步骤主要是把依赖信息都打进pom文件里
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')
}
}
}
}
}
}
3.2 发布
在编写完对应的上传脚本后,就需要在对应的module的build.gradle文件里引用前面编写好的脚本:
apply from: 'upload.gradle'
android {
buildTypes {
release {
minifyEnabled false
proguardFiles 'proguard-rules.pro'
}
debug {
minifyEnabled false
}
}
}
.....
在搞定了这些后,我们就只需要编写简单的shell脚本build.sh就可以轻松上传到远程仓库了:
echo "start clean"
gradle clean
echo "end clean"
# 打出要上传的release 的aar包
gradle assembleRelease
# 执行上传命令
gradle publish
4 总结
本文介绍了两种发布AAR包到远程Maven仓库的方法:maven插件和maven-publish插件。对于Gradle 7.0之前的版本,可以使用maven插件;而对于7.0及之后的版本,推荐使用maven-publish插件。通过提供的脚本示例,读者可以轻松地将AAR包发布到远程仓库,大家有需要的可直接复制脚本到工程里就可运行了,如果想了解更多的细节,可查看官方的指导文档。
5 参考
如何高效发布Android AAR包到远程Maven仓库的更多相关文章
- 部署Jar包到远程Maven仓库
在使用maven开发工程时,模块A可能会依赖模块B的jar包,如果两个模块都是在一个工程里,只需要在模块A的pom文件中加入模块B的依赖信息,模块A就可以加载模块B的jar包.但如果模块A与模块B在不 ...
- 【Maven】2.使用Nexus3搭建Maven私服+上传第三方jar包到本地maven仓库
参考文章: http://www.cnblogs.com/luotaoyeah/p/3791966.html --------------------------------------------- ...
- 使用Nexus3搭建Maven私服+上传第三方jar包到本地maven仓库
1.搭建Maven私服背景 公司还是按捺不住,要搭建一个自己的Maven本地仓库,可以让开发人员down架包,从内网还是快很多. 这样公司的maven本地仓库就是 开发人员自己电脑上的maven仓库 ...
- 添加jar包到本地Maven仓库
在使用Maven的过程中,经常碰到有些jar包在中央仓库没有的情况.如果公司有私服,那么就把jar包安装到私服上.如果没有私服,那就把jar包安装到本地Maven仓库.今天介绍2种 ...
- 本地jar包添加至Maven仓库
Maven命令将本地的jar包方放到maven仓库中 //自定义本地的jar包在pom文件的参数 <dependency> <groupId>com.eee</group ...
- 怎样在nexus 中 搜索到远程maven仓库中的jar 文件
怎样在nexus 中 搜索到远程maven仓库中的jar 文件 url: http://www.oschina.net/question/95712_21999 点击Administration菜单下 ...
- Maven如何手动添加jar包到本地Maven仓库
Apache Maven,是一个软件(特别是Java软件)项目管理及自动构建工具,由Apache软件基金会所提供.基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构 ...
- [转]Maven如何手动添加jar包到本地Maven仓库
Apache Maven,是一个软件(特别是Java软件)项目管理及自动构建工具,由Apache软件基金会所提供.基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项 ...
- 手动添加jar包到本地maven仓库
我们都知道使用maven管理jar包的时候,我们需要到远程仓库下载相关的jar包到本地仓库,但是如果远程仓库没有这个jar包呢?这时候我们就需要手动将jar包添加到本地仓库. 起因是我想用百度的富文本 ...
- Nexus远程Maven仓库索引下载教程
下载Maven仓库索引有两种方式: 一.手动下载 首先将索引下载到本地,下载地址:nexus-maven-repository-index.zip 解压索引压缩包,将里面内容全部拷贝 关闭当前Ne ...
随机推荐
- CSS动画(动态导航栏)
1.项目简介 一个具有创意的导航菜单不仅能为你的大作业增色,还能展示你的技术实力.本文将分享一系列常用于期末大作业的CSS动画导航效果,这些效果不仅外观酷炫,而且易于实现.我们提供了一键复制的代码,让 ...
- SSIS作业提示所请求的 OLE DB 访问接口 Microsoft.ACE.OLEDB.12.0 尚未注册
没有跨不过的坎,也没有解决不了的问题,那些曾经没有把我们打死的困难,最终都会让我们变得更加强大 最近在使用ETL获取Excel数据时,在本地运行没有任何问题,部署到服务器后,使用作业运行时便一直提示以 ...
- 『玩转Streamlit』--登录认证机制
如果你的Streamlit App中使用的数据的比较敏感,那么,保护这个App及其背后的数据免受未授权访问变得至关重要. 无论是出于商业机密的保护.用户隐私的维护,还是为了满足日益严格的合规要求,确保 ...
- 利用DbgHelp获取线程的栈回溯信息
当线程发生异常时,我们如果可以记录下来异常线程的堆栈信息,那么对于我们后续问题处理将会有极大的帮助.这里记录一个操作方法. 1 #include <iostream> 2 #include ...
- 【转载】hyperNeat进化神经网络算法——HyperNEAT Explained——Advancing Neuroevolution
原文地址: HyperNEAT Explained: Advancing Neuroevolution Expanding NeuroEvolution Last week, I wrote an a ...
- normal matrix 正规矩阵
资料来源 In mathematics, a complex square matrix A is normal if 满足此条件也意味着A可对角化. 所以,厄米矩阵和幺正矩阵都是正规矩阵.
- 海外模组联网难?那你必须看看APN配置…
做海外的设备,如果忽视了射频的信号质量,肯定是要吃大亏的! 因为国外的4G信号都是比较差的! 所以,海外模组的联网问题,会比国内要多不少. 客户在实际应用中或多或少都会遇到: 网络相关问题:例如:连 ...
- 全新向量数据库SQL Server 2025:带你迈入AI驱动的数据未来
全新向量数据库SQL Server 2025:带你迈入AI驱动的数据未来 上次大家下单的<微软憋大招:SQL Server + Copilot = 地表最强AI数据库!> 抱怨迟迟没有发货 ...
- 29、undo_2_1(事务槽、延迟块清除、构造CR块、ora-01555)
事务槽(不同于事务表里面的槽位(这个事务槽在数据块的头部)) 图解: 一个事务开始,要做的事情: 第一,事务表里面找槽位(undo段的段头块里有事务表,事务表有槽位,每一个槽位记录一个事务): 事务表 ...
- python数据结构的性能分析
2.python数据结构的性能分析 一.引言 - 现在大家对 大O 算法和不同函数之间的差异有了了解.本节的目标是告诉你 Python 列表和字典操作的 大O 性能.然后我们将做一些基于时间的实验来说 ...