文章目录
一、需求背景
因为在有维护比较多的Android项目,在最近升级的过程总是出现最低版本编译(minCompileSdk
)错误,所以决定创建相关BOM
帮助自己的对一些老项目进行升级,这些项目有些准备升级到33,有些升级31,新的项目直接34
Dependency 'androidx.xxxxx.xxx' requires libraries and applications that
depend on it to compile against version 34 or later of the Android APIs.
启发来自 Compose Bom,刚好学习一下相关知识,然后做一点记录。
二、BOM介绍
BOM (Bill Of Material) 是 Maven 仓库中的一个概念,它本质也是一个可被引用的包,但不包含代码,只是声明了一系列其它包。
- 方便使用者在声明依赖的客户端时不需要指定版本号外,
- 最主要的原因是可以解决依赖冲突
Bom 通常是项目中单独的一个模块,即只有单个pom.xml文件的module,并配合 dependencyManagement 等标签实现项目的全局依赖统一管理
三、利用Gradle创建BOM
首先我们都知道BOM本质上是一个普通的POM文件,区别是对于使用方而言,生效的只有 <dependencyManagement>
这一个部分。
示例:
<dependencyManagement>
<dependencies>
<!-- 统一依赖管理 -->
<dependency>
<groupId>xxxx.xxx</groupId>
<artifactId>xxx</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>xxxx.xxx</groupId>
<artifactId>xxx</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</dependencyManagement>
所以我们只需要在publishing
添加给pom.xml
添加<dependencyManagement>
这一个部分内容就好了。
3.1 操作步骤
首先直接上代码,然后再解释相关步骤,我是基于Android Stuido
进行开发的,使用的是kts.
plugins {
alias(libs.plugins.androidLibrary)
alias(libs.plugins.jetbrainsKotlinAndroid)
id("maven-publish") //1. 发布插件
}
android {
namespace = "com.androidx.bom"
compileSdk = 34
/**代码省略,可以忽视**/
}
class MavenDep(val group: String, val name: String, val version: String)
// 这里是管理相关依赖版本
val depList = mutableListOf<MavenDep>().apply {
add(MavenDep("androidx.core", "core-ktx", libs.versions.androidx.core.get()))
add(MavenDep("androidx.appcompat", "appcompat", libs.versions.androidx.appcompat.get()))
/**其他依赖内容**/
}
//核心实现部分
publishing {
publications {
//2. 创建发布的内容
create<MavenPublication>("release") {
groupId = "com.github.SheTieJun"
artifactId = "androidx-bom"
version = "34.1.0.0"
pom.withXml {
//3.修改pom,将相关依赖添加dependencyManagement中
asNode().appendNode("dependencyManagement")
.appendNode("dependencies")
.also { dependencies ->
depList.forEach { mavenDep ->
val depNode = dependencies.appendNode("dependency")
depNode.appendNode("groupId", mavenDep.group)
depNode.appendNode("artifactId", mavenDep.name)
depNode.appendNode("version", mavenDep.version)
}
}
}
}
}
}
相关创建步骤:
- 创建一个模块,我这里*
androidLibrary
*,(也可以是java lib,然后在
build.gradle.kts`中添加发布插件
id("maven-publish") //1. 发布插件
- 创建发布内容
publishing {
publications {
create<MavenPublication>("release") {
groupId = "com.github.SheTieJun"
artifactId = "androidx-bom"
version = "34.1.0.0"
}
}
}
- 修改POM,添加dependencyManagement,以及相关依赖
pom.withXml {
asNode().appendNode("dependencyManagement")
.appendNode("dependencies")
.also { dependencies ->
//depList 是上面写到的相关依赖版本
depList.forEach { mavenDep ->
val depNode = dependencies.appendNode("dependency")
depNode.appendNode("groupId", mavenDep.group)
depNode.appendNode("artifactId", mavenDep.name)
depNode.appendNode("version", mavenDep.version)
}
}
}
-
生成BOM,可以直接点击
publishToMavenLocal
发布到本地,也可以利用jitpack
进行发布,甚至mavenCentral
发布到本地和jitpack,都很简单,我就不细讲了。可以看androidx-bom。
-
使用BOM,
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenLocal() //如果发布在本地
mavenCentral()
maven("https://jitpack.io") //如果发布到jitpack
}
}
api(platform("com.github.SheTieJun:androidx-bom:34.1.0.0"))
api 'androidx.activity:activity-ktx'
api 'androidx.fragment:fragment-ktx'
api("androidx.appcompat:appcompat")
//省略
四、Androidx-bom:BOM to JetPack Androidx library version mapping for minCompileSdk.
项目是基于Androidx Jetpack ,主要方便自己维护的项目的Androidx相关的依赖进行升级,我希望尽量的新Lib, 同时又不用每次都去查找对应的版本。
目前初步完成,但是不是含有所有的Jetpack项目,只是一些常用的项目。
如果你有需要其他,还是需要你自己去查找对应的版本,也可以对当前项目进行升级 ,你也可以fork下来,进行自定义添加相关自己的依赖,如果涉及一些私有库,你可以发布的话到本地、gitlab的package等等`