一文详解 jitpack 多渠道maven库发布
先说一下,为什么会有这篇文章?
最初接触 JitPack 时,发现网络上大量涉及JitPack的教程不可用。通过两天的研究才搞明白:
1.不同的gradle版本,gradle api使用方式 与 JitPack配置方式均有所差异:使用JitPack发布Maven依赖库,其配置脚本与开发者使用的 gradle 版本是强相关的,因此不同的gradle版本,其API使用方式与 JitPack配置需做对应调整;
2.官方案例不好使:JitPack的官方案例为 multi-flavor-lib-demo ,2018年最后一次更新,其使用的 gradle 版本相对较低,当前的gradle版本无法使用。
以上两点,可能是网络文章质量较低的主要原因,因此这里将我两天来的学习成果分享给朋友们,帮助大家节省一些时间。
Android应用开发过程中,开发者通常通过 gradle dependencies 导入第三方依赖库,那么当开发者的SDK或中间件被其他项目依赖时,该如何发布自己的maven依赖库呢?
这里推荐一个Github的构建工具 https://jitpack.io/ 。
- JitPack 简介
 - JitPack 使用及案例举例
 - 案例源码下载
 
一、JitPack简介
JitPack 是一 个构建与发布 Git 存储库的便捷服务,可用于在 GitHub、GitLab 上打包、发布与部署依赖库,便于使用者通过maven依赖的形式引用开发者发布的依赖库。

JitPack允许开发者将 GitHub、GitLab上的JVM和Android 项目发布到Jitpack 的 Maven 仓库;JitPack通过搜索开发者输入的git仓库链接地址的形式,自动查找Git上的工程代码,并进行自动打包、构建依赖库(对于开发者来说,基本实现了一键发布依赖库);JitPack允许开发者将 Git 存储库(包括存储库的任何一个分支或分支的某一次commit提交)以不同版本的形式进行构建、发布为maven依赖库,便于开发者进行版本发布与维护;- 使用价格方面,
对于开源项目 JitPack 是完全免费的。

 
二、JitPack 使用
配置jitpack需采用gradle API编写配置脚本,随着gradle版本的更新,相关API及使用方式也有了一定的变化。
这里分别基于 gradle 6.1 与 gradle 7.5 举例 jitpack 多渠道发布。
- gradle 6.1 配置 JitPack
 - gradle 7.5 配置 JitPack
 
2.1 gradle6.1配置JitPack
举例代码中使用的 gradle版本 与 插件版本 如下:
gradle版本: https://services.gradle.org/distributions/gradle-6.1.1-all.zip
插件版本:com.android.tools.build:gradle:3.6.1
举例代码中 jitpack 编译结果:
https://javadoc.jitpack.io/com/github/AndroidAppCodeDemo/jitpack_MultiFlavorLibDemo/gradle_6_1-SNAPSHOT/

下边通过以下两个方面进行详细说明:
- gradle 6.1 使用 jitpack 进行多渠道 Maven 依赖库发布详细举例说明;
 - 如何引用 jitpack Maven发布的多渠道依赖库?
 
2.1.1 jitpack多渠道配置
gradle 6.1 使用 jitpack 进行多渠道 Maven 依赖库发布详细举例说明:
假定 要发布的库 其渠道配置信息如下:
// 渠道举例
flavorDimensions "vendor"
productFlavors {
	production {
		dimension "vendor"
		buildConfigField 'String', 'ENV', '"PRODUCTION"'
	}
	sandbox {
		dimension "vendor"
		buildConfigField 'String', 'ENV', '"SANDBOX"'
	}
}
- 首先,需添加 
android-maven-gradle-plugin插件:
在Android工程根目录build.gradle中,添加android-maven-gradle-plugin插件。 
buildscript {
    dependencies {
        // 1、添加 android-maven-gradle-plugin
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
    }
}
- 添加 
发布渠道包配置:
按照如下代码举例,在对应Module工程build.gradle中添加如下4步配置: 
// 2、应用插件
apply plugin: 'com.github.dcendents.android-maven'
android {
	// ...
    // 3、默认发布渠道
    defaultPublishConfig "productionRelease"
    // 4、true to publish all flavour artifacts
    publishNonDefault true
}
// 5、添加“发布多渠道依赖包配置”
if (android.productFlavors.size() > 0) {
    android.libraryVariants.all { variant ->
        if (variant.name.toLowerCase().contains("debug")) {
            return
        }
        def bundleTask = tasks["bundle${variant.name.capitalize()}Aar"]
        artifacts {
            archives(bundleTask.archivePath) {
                classifier variant.flavorName
                builtBy bundleTask
                name = project.name
            }
        }
    }
}
以上的5个步骤参考了 jitpack-io官方 multi-flavor-lib-demo 样例工程
2.1.2 引用 jitpack 发布的多渠道依赖库
在上一步中,我们顺利发布了 maven 依赖库,这里记录一下如何使用我们发布的依赖库?
- 在Android工程
根目录build.gradle添加jitpack 仓库地址: 
allprojects {
	repositories {
		// 1、添加 jitpack 仓库地址
		maven { url 'https://jitpack.io' }
	}
}
- 在对应Android工程
引用依赖包的Module中添加如下依赖: 
dependencies {
	// 2、添加库文件依赖:
	// implementation "com.github.<USER>.<REPO>:<library-module>:<version>:<flavor-name>@aar"
	// production 渠道
 	implementation 'com.github.AndroidAppCodeDemo:jitpack_MultiFlavorLibDemo:gradle_6_1-SNAPSHOT:production@aar'
 	// sandbox 渠道
 	implementation 'com.github.AndroidAppCodeDemo:jitpack_MultiFlavorLibDemo:gradle_6_1-SNAPSHOT:sandbox@aar'
}
2.2 gradle7.5配置JitPack
举例代码中使用的 gradle版本 与 插件版本 如下:
gradle版本: https://services.gradle.org/distributions/gradle-7.5-bin.zip
插件版本:com.android.tools.build:gradle:7.4.1
举例代码中 jitpack 编译结果:
https://javadoc.jitpack.io/com/github/AndroidAppCodeDemo/jitpack_MultiFlavorLibDemo/gradle_7_5-SNAPSHOT/

下边通过以下两个方面进行详细说明:
- gradle 7.5 使用 jitpack 进行多渠道 Maven 依赖库发布详细举例说明;
 - 如何引用 jitpack Maven发布的多渠道依赖库?
 
2.2.1 jitpack多渠道配置
gradle 7.5 使用 jitpack 进行多渠道 Maven 依赖库发布详细举例说明(假定 仍采用上一步案例中的渠道配置信息):
- 应用 maven-publis 插件:
根据 android developer:Maven Publish 中介绍,Android gradle 插件3.6以上版本可以应用Maven Publish插件:

因此,在对应工程要发布的依赖Module中添加如下配置: 
plugins {
	// 1、添加 maven-publish
    id 'maven-publish'
}
- 添加 
发布渠道包配置:
发布渠道依赖包的配置信息,主要是参考Android Developer Gradle-API-7.1 LibraryPublishing:

在对应工程要发布的依赖Module中添加如下配置: 
android {
    // 2、默认渠道
    defaultPublishConfig "productionRelease"
    // 3、发布渠道配置
    publishing {
        // Publishes all build variants with "vendor" component
        multipleVariants("vendor") {
        	// 只发布release包
            includeBuildTypeValues("release")
            includeFlavorDimensionAndValues("vendor", "production","sandbox")
        }
    }
}
// 4、依赖包发布配置信息
afterEvaluate {
    publishing {
        publications {
            allVariants(MavenPublication) {
                // 发布后的依赖包按如下配置进行引用:com.github.AndroidAppCodeDemo:jitpack_MultiFlavorLibDemo:1.0.2
                from components.vendor // 表示发布 release
                groupId = 'com.github.AndroidAppCodeDemo' // 这个是依赖库的组 id
                artifactId = 'jitpack_MultiFlavorLibDemo' // 依赖库的名称
                version = "1.0.2"     // 当前版本依赖库版本号
            }
        }
        repositories {
            maven {
                def baseUrl = buildDir.getParent()
                def releasesRepoUrl = "$baseUrl/repos/releases"
                def snapshotsRepoUrl = "$baseUrl/repos/snapshots"
                url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
            }
        }
    }
}
// 5、生成source jar
task generateSourcesJar(type: Jar) {
    from android.sourceSets.main.java.srcDirs
    classifier 'sources'
}
2.2.2 引用 jitpack 发布的多渠道依赖库
在上一步中,我们顺利发布了 maven 依赖库,这里记录一下如何使用我们发布的依赖库?
- 在Android工程
根目录build.gradle添加jitpack 仓库地址: 
allprojects {
	repositories {
		// 1、添加 jitpack 仓库地址
		maven { url 'https://jitpack.io' }
	}
}
- 在对应Android工程
引用依赖包的Module中添加如下依赖: 
dependencies {
	// 2、添加库文件依赖:
	// implementation "com.github.<USER>.<REPO>:<library-module>:<version>:<flavor-name>@aar"
	// production 渠道
 	implementation 'com.github.AndroidAppCodeDemo:jitpack_MultiFlavorLibDemo:gradle_7_5-SNAPSHOT:production@aar'
 	// sandbox 渠道
 	implementation 'com.github.AndroidAppCodeDemo:jitpack_MultiFlavorLibDemo:gradle_7_5-SNAPSHOT:sandbox@aar'
}
三、案例源码
本文所使用的案例工程 下载地址 如下:
https://download.csdn.net/download/aiwusheng/87473529
源码中包含两个案例,分别对应Gradle 6.1与Gradle 7.5两个版本:
- jitpack_MultiFlavorLibDemo_gradle_6_1
 - jitpack_MultiFlavorLibDemo_gradle_7_5
 

参考
jitpack-io官方multi-flavor-lib-demo:
https://github.com/jitpack-io/multi-flavor-lib-demo
jitpack-io官方jitpack-android-sample:
https://github.com/jitpack-io/jitpack-android-sample
android developer 使用 Maven Publish 插件:
https://developer.android.google.cn/studio/build/maven-publish-plugin?hl=zh-cn
android developer gradle-api-7.1:
https://developer.android.com/reference/tools/gradle-api/7.1/com/android/build/api/dsl/LibraryPublishing
android developer gradle-api-8.0:
https://developer.android.google.cn/reference/tools/gradle-api/8.0/com/android/build/api/dsl/LibraryPublishing
android developer 配置发布内容变体:
https://developer.android.google.cn/studio/publish-library/configure-pub-variants?hl=zh-cn
gradle docs publishing_maven:
https://docs.gradle.org/current/userguide/publishing_maven.html
= THE END =
文章首发于公众号”CODING技术小馆“,如果文章对您有帮助,欢迎关注我的公众号。

一文详解 jitpack 多渠道maven库发布的更多相关文章
- 一文详解Hexo+Github小白建站
		
作者:玩世不恭的Coder时间:2020-03-08说明:本文为原创文章,未经允许不可转载,转载前请联系作者 一文详解Hexo+Github小白建站 前言 GitHub是一个面向开源及私有软件项目的托 ...
 - Oracle内存详解之 Library cache 库缓冲
		
Oracle内存详解之 Library cache 库缓冲 2017年11月09日 11:38:39 阅读数:410更多 个人分类: 体系结构 Library cache是Shared pool的一部 ...
 - 一文详解 Linux 系统常用监控工一文详解 Linux 系统常用监控工具(top,htop,iotop,iftop)具(top,htop,iotop,iftop)
		
一文详解 Linux 系统常用监控工具(top,htop,iotop,iftop) 概 述 本文主要记录一下 Linux 系统上一些常用的系统监控工具,非常好用.正所谓磨刀不误砍柴工,花点时间 ...
 - 搭建私有maven库发布及使用流程
		
一:背景 Apache Maven是当Java技术栈前最流行的项目管理工具,它提供了一系列方便快捷的命令帮助程序员们进行Java工程的开发工作.Maven服务器位于美国,由于出国带宽和众多因素,在国内 ...
 - 私有maven库发布及使用流程
		
## 私有maven库发布流程 ### 环境配置 - idea环境下,如果使用内置maven,需要手动生成settings.xml,并关联. - 操作如下 - 生成settings.xml 右键pom ...
 - 一文详解 OpenGL ES 3.x 渲染管线
		
OpenGL ES 构建的三维空间,其中的三维实体由许多的三角形拼接构成.如下图左侧所示的三维实体圆锥,其由许多三角形按照一定规律拼接构成.而组成圆锥的每一个三角形,其任意一个顶点由三维空间中 x.y ...
 - 一文详解Redis键过期策略
		
摘要:Redis采用的过期策略:惰性删除+定期删除. 本文分享自华为云社区<Redis键过期策略详解>,作者:JavaEdge. 1 设置带过期时间的 key # 时间复杂度:O(1),最 ...
 - 一文详解 WebSocket 网络协议
		
WebSocket 协议运行在TCP协议之上,与Http协议同属于应用层网络数据传输协议.WebSocket相比于Http协议最大的特点是:允许服务端主动向客户端推送数据(从而解决Http 1.1协议 ...
 - 1.3w字,一文详解死锁!
		
死锁(Dead Lock)指的是两个或两个以上的运算单元(进程.线程或协程),都在等待对方停止执行,以取得系统资源,但是没有一方提前退出,就称为死锁. 1.死锁演示 死锁的形成分为两个方面,一个是使用 ...
 - 一文详解 Linux Crontab 调度任务
		
最近接到这样一个任务: 定期(每天.每月)向"特定服务器"传输"软件服务"的运营数据,因此这里涉及到一个定时任务,计划使用Python语言添加Crontab依赖 ...
 
随机推荐
- day12 多线程1.进程与线程 & 2.线程生命周期 & 3.线程同步机制
			
day12 bigDecimal,用于计算钱的数据类型 多线程 线程与进程 进程 1)执行中的应用程序 2)一个进程可以包含一个或者多个线程 3)一个进程至少要包含一个线程(如main方法) 线程 线 ...
 - 数电第二周总结_by_yc
			
数电第二周总结_CC 重点: 模块实例化.仿真测试.数值表示.参数.表达式. 模块实例化端口连接方法: A.顺序端口连接:需严格按照模块定义时的顺序 B.明明端口连接:对端口信号顺序不做要求 Ex-1 ...
 - 【实时数仓】Day01-数据采集层:数仓分层、实时需求、架构分析、日志数据采集(采集到指定topic和落盘)、业务数据采集(MySQL-kafka)、Nginx反向代理、Maxwell、Canel
			
一.数仓分层介绍 1.实时计算与实时数仓 实时计算实时性高,但无中间结果,导致复用性差 实时数仓基于数据仓库,对数据处理规划.分层,目的是提高数据的复用性 2.电商数仓的分层 ODS:原始日志数据和业 ...
 - ffmpeg库安装及入门指南(Windows篇)- 2022年底钜献
			
最近项目需要,使用了 ffmpeg 做摄像头视频采集和串流.这几天有点时间,打算把相关的一些知识记录分享一下. 在撰写本文时,我又在另外一台电脑上把 ffmpeg 重新安装了一遍,所以绝对真实靠谱!如 ...
 - 为什么 Random.Shared 是线程安全的
			
在多线程环境中使用 Random 类来生成伪随机数时,很容易出现线程安全问题.例如,当多个线程同时调用 Next 方法时,可能会出现种子被意外修改的情况,导致生成的伪随机数不符合预期. 为了避免这种情 ...
 - 《HTTP权威指南》– 4.HTTP连接管理
			
浏览器解析URL流程: 浏览器解析出域名: 浏览器查询这个主机名的IP地址: 浏览器获得端口号: 浏览器发起到主机名IP地址端口的80连接: 浏览器向服务器发送一条HTTP–GET报文: 浏览器从服务 ...
 - vue 实现一键复制功能(两种方式)
			
方法 一 : <div class="mask-cont"> <p><input id="input" /></p&g ...
 - python 数据迁移
			
Python数据库迁移 操作数据库 mysql uroot -p create database Python1031 charset=utf8; 数据迁移 from flask_migrate im ...
 - Young's theorem杨氏定理
			
杨氏定理 定理叙述 参考百度百科. Young's Theorem: Let \(f\) be a differentiable function of \(n\) variables. If eac ...
 - elasticsearch之exists查询
			
一.exists查询简介 elastic search提供了exists查询,用以返回字段存在值的记录,默认情况下只有字段的值为null或者[]的时候,elasticsearch才会认为字段不存在: ...