首页 > 其他分享 >一文详解 jitpack 多渠道maven库发布

一文详解 jitpack 多渠道maven库发布

时间:2023-02-21 23:46:18浏览次数:48  
标签:依赖 gradle maven 详解 android com jitpack

先说一下,为什么会有这篇文章?
最初接触 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

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

二、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/
jitpack编译结果

下边通过以下两个方面进行详细说明:

  • 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/
jitpack编译结果

下边通过以下两个方面进行详细说明:

  • 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插件:
    android developer 使用 Maven Publish 插件
    因此,在对应工程要发布的依赖Module添加如下配置
plugins {
	// 1、添加 maven-publish
    id 'maven-publish'
}
  • 添加 发布渠道包配置
    发布渠道依赖包的配置信息,主要是参考Android Developer Gradle-API-7.1 LibraryPublishing:
    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_MultiFlavor_gradle61 与 gradle75

参考

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技术小馆“,如果文章对您有帮助,欢迎关注我的公众号。
欢迎关注我的公众号

标签:依赖,gradle,maven,详解,android,com,jitpack
From: https://www.cnblogs.com/xiaxveliang/p/17142921.html

相关文章

  • Symbol详解
    SymbolSymbol是es6引入的一个新的原始数据类型,是一个独一无二的值。目前为止,js的数据类型有以下几种:数据类型说明undefinedundefinednullnullboolean......
  • Map数据结构详解
    MapObject本质上是键值对的集合(Hash结构),但Object只能将字符串当做键,这就给Object带来了很大的限制。letdata={}lets={name:'东方不败'}data[s]='西......
  • LVS三种工作模式及原理详解
    什么是LVS?摘自:https://blog.csdn.net/qq_59369367/article/details/124951685LVS是LinuxVirtualServer的简写,也就是Linux虚拟服务器,是一个虚拟的服务器集群系统,......
  • 套接字连接以及TCP三次握手详解
    在套接字和地址文章中,我们画出基于套接字接口网络应用的一张图,本文章就是详细解释这些函数具体怎么实现的。socket创建套接字客户端和服务器使用socket函数来创建一个套......
  • Kroger EDI 855 采购订单确认报文详解
    本文着重讲述KrogerEDI项目中,供应商发给Kroger的X12855EDI规范报文(采购订单确认)解读。在此前的文章如何读懂X12报文中,我们对X12已经做了详细的介绍,大家可以以此为基础......
  • bfs详解
    bfs详解1,bfs的基本概念bfs是广度优先搜索,是一种对树形结构的遍历,他的思想是先选定一个点,从这个点出发,每次只走一步,分为四个方向,直到找到正确答案,相较于dfs的直接递归,bfs......
  • Flutter帧率监控 | 由浅入深,详解获取帧率的那些事
    前言做线上帧率监控上报时,少不了需要弄明白如何通过代码获取实时帧率的需求,这篇文章通过图解配合Flutter性能调试工具的方式一步步通俗易懂地让你明白获取帧率的基础知识,以......
  • 一文详解SpEL表达式注入漏洞
    摘要:本文介绍了SpEL表达式以及常见的SpEL注入攻击,详细地介绍了部分漏洞攻击实例以及常用的漏洞检测与防御手段。本文分享自华为云社区《​​SpEL表达式注入漏洞分析、检查与......
  • 华为HCIA认证R&S路由与交换综合实验案例详解
    HCIA-R&S综合实验一这篇文章主要介绍了华为HCIA认证R&S路由与交换综合实验,结合具体实验案例形式详细分析了华为HCIA认证路由与交换子网划分、路由配置相关原理、操作技巧与......
  • 使用java.util.Timer实现定时任务,详解Thread.sleep() in a loop, probably busy-waiti
    很多时候,我们需要定时任务实现一些诸如刷新,心跳,保活等功能。这些定时任务往往逻辑很简单,使用定时任务的框架(例如springboot@Scheduled)往往大材小用。下面是一个定时任......