先说一下,为什么会有这篇文章?

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

二、JitPack 使用

配置jitpack需采用gradle API编写配置脚本,随着gradle版本的更新,相关API及使用方式也有了一定的变化。

这里分别基于 gradle 6.1gradle 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库发布的更多相关文章

  1. 一文详解Hexo+Github小白建站

    作者:玩世不恭的Coder时间:2020-03-08说明:本文为原创文章,未经允许不可转载,转载前请联系作者 一文详解Hexo+Github小白建站 前言 GitHub是一个面向开源及私有软件项目的托 ...

  2. Oracle内存详解之 Library cache 库缓冲

    Oracle内存详解之 Library cache 库缓冲 2017年11月09日 11:38:39 阅读数:410更多 个人分类: 体系结构 Library cache是Shared pool的一部 ...

  3. 一文详解 Linux 系统常用监控工一文详解 Linux 系统常用监控工具(top,htop,iotop,iftop)具(top,htop,iotop,iftop)

    一文详解 Linux 系统常用监控工具(top,htop,iotop,iftop)     概 述 本文主要记录一下 Linux 系统上一些常用的系统监控工具,非常好用.正所谓磨刀不误砍柴工,花点时间 ...

  4. 搭建私有maven库发布及使用流程

    一:背景 Apache Maven是当Java技术栈前最流行的项目管理工具,它提供了一系列方便快捷的命令帮助程序员们进行Java工程的开发工作.Maven服务器位于美国,由于出国带宽和众多因素,在国内 ...

  5. 私有maven库发布及使用流程

    ## 私有maven库发布流程 ### 环境配置 - idea环境下,如果使用内置maven,需要手动生成settings.xml,并关联. - 操作如下 - 生成settings.xml 右键pom ...

  6. 一文详解 OpenGL ES 3.x 渲染管线

    OpenGL ES 构建的三维空间,其中的三维实体由许多的三角形拼接构成.如下图左侧所示的三维实体圆锥,其由许多三角形按照一定规律拼接构成.而组成圆锥的每一个三角形,其任意一个顶点由三维空间中 x.y ...

  7. 一文详解Redis键过期策略

    摘要:Redis采用的过期策略:惰性删除+定期删除. 本文分享自华为云社区<Redis键过期策略详解>,作者:JavaEdge. 1 设置带过期时间的 key # 时间复杂度:O(1),最 ...

  8. 一文详解 WebSocket 网络协议

    WebSocket 协议运行在TCP协议之上,与Http协议同属于应用层网络数据传输协议.WebSocket相比于Http协议最大的特点是:允许服务端主动向客户端推送数据(从而解决Http 1.1协议 ...

  9. 1.3w字,一文详解死锁!

    死锁(Dead Lock)指的是两个或两个以上的运算单元(进程.线程或协程),都在等待对方停止执行,以取得系统资源,但是没有一方提前退出,就称为死锁. 1.死锁演示 死锁的形成分为两个方面,一个是使用 ...

  10. 一文详解 Linux Crontab 调度任务

    最近接到这样一个任务: 定期(每天.每月)向"特定服务器"传输"软件服务"的运营数据,因此这里涉及到一个定时任务,计划使用Python语言添加Crontab依赖 ...

随机推荐

  1. Java锁的逻辑(结合对象头和ObjectMonitor)

    我们都知道在Java编程中多线程的同步使用synchronized关键字来标识,那么这个关键字在JVM底层到底是如何实现的呢. 我们先来思考一下如果我们自己实现的一个锁该怎么做呢: 首先肯定要有个标记 ...

  2. Nmap安装

    Nmap(Network Mapper,网络映射器)是一款开放源代码的网络探测和安全审核工具.它被设计用来快速扫描大型网络,包括主机探测与发现.开放的端口情况.操作系统与应用服务指纹识别.WAF识别及 ...

  3. JavaScript:对象:对象和属性的内存结构是什么样的?

    在说变量的时候,大致画了变量的内存结构,现在来看一下对象的内存结构是什么样的,有助于我们理解传参的各种情况,只是大致的画一下内存模型,不代表实际内存情况. 我们可以用一段代码,来判断一下,是不是这样的 ...

  4. c++中编码protobuf repeated string

    参考:http://www.cppblog.com/API/archive/2014/12/09/209070.aspx proto文件 addressbook.proto syntax = &quo ...

  5. DNS欺骗

    原理: dns欺骗又可以叫作中间人人攻击,主要是通过拦截受害人在访问某个网站时设备向外发送的dns请求,然后给出伪造的dns应答,实现欺骗过程. 实验脚本如下: from scapy.layers.d ...

  6. CVE-2022-26923 Windows域提权漏洞

    前言 Active Directory 域服务,是一种目录服务,提供了存储目录数据信息以及用户相关的一些密码,电话号码等等一些数据信息,且可让用户和管理员使用这些数据,有利于域管理员对用户的数据信息进 ...

  7. [UOJ96] 【集训队互测2015】胡策的小树

    先考虑不掺金坷垃的做法. 设猴子处于 \(i\) 节点的概率为 \(f_i\),列出方程如下(\(i\) 的祖先包括自身): \[f_i = \sum_{j为i祖先}\frac{1-p_j}{siz_ ...

  8. 纸张尺寸【第十三届蓝桥杯省赛C++C组】

    纸张尺寸 在 ISO 国际标准中定义了 \(A0\) 纸张的大小为 \(1189mm×841mm\),将 \(A0\) 纸沿长边对折后为 \(A1\) 纸,大小为 \(841mm×594mm\) ,在 ...

  9. 【3.x合批亲测】使用这个优化方案,iPhone6也能飞起来,直接拉满60帧!

    大家好,我是晓衡! 上周我花了3天的时间,体验测试了一款 Creator 3.x 性能优化工具:98K动态分层合批. 它能将 DrawCall 超过 1000+ 次的 2D 界面,实现运行时节点分层排 ...

  10. Java基础学习笔记-运算符ヽ( ̄▽ ̄)و

    运算符 运算符-按功能分为7种 1.赋值运算符 广义赋值运算符 +=, -=, *=, /=, %=, &=, |= 一般形式:变量名 运算符=表达式 两侧的类型不一致会进行 自动类型转换 和 ...