Gradle 统一管理依赖

news2024/9/21 22:43:38

BOM 介绍

BOM 是 Bill of Material 的简写,表示物料清单。BOM 使我们在使用 Maven 或 Gradle 构建项目时对于依赖版本的统一变得更加规范,升级依赖版本更容易。

比如我们使用 SpringBoot 和 SpringCloud 做项目时,可以使用他们发布的 BOM

  • spring-boot-dependencies
  • spring-cloud-dependencies

使用 Gradle 发布 BOM

在公司的大型项目中,可能对于依赖的版本需要有一个统一的管理,确保所有的项目的依赖都是一致的。

当需要升级某个依赖版本时,只需要更改 BOM 项目的版本并给发布一个新版本的 BOM 项目,然后在其他项目中引入这个新版本的 BOM 即可。

既然 BOM 这么便利,Gradle 没有理由不提供一个发布 BOM 的功能,Gradle 中的这个功能由插件 java-platform 实现。

官网关于插件的使用方式:https://docs.gradle.org/7.6.2/userguide/java_platform_plugin.html

建立 Gradle 项目的过程就省略了,可以看我其他的文章,此处假定已建立好一个项目,名字叫做:test-bom。

修改项目目录下的 build.gradle,使用以下代码引入插件:

plugins {
	id "java-platform"
}

很简单,引入这个插件之后只需要在 dependencies 下面的 constraints 中使用 api 方法引入任意喜欢的版本的依赖即可:

dependencies {
	constraints {
		// 比如此处我引入了 commons-lang3 的 jar
		api("org.apache.commons:commons-lang3:3.12.0")
		// 其他的直接向下添加即可
	}
}

此处多出来一层 constraints。如果没有 constraints 的话,引用此 BOM 的项目,会自动引入 org.apache.commons:commons-lang3:3.12.0,即使没有使用 implementation 方法引入,这里涉及到 api 方法的其他方面,详见:Gradle几种引入依赖的方式介绍。

到这里这个 BOM 项目就好了。但是还有一个问题,我这个 BOM 如何给别人使用?和其他基础 库一样使用 maven-publish 插件。

首先引入 maven-publish 插件:

plugins {
	id "maven-publish"
}

接着定义 publish 的内容:

publishing {
    publications {
        testPlatform(MavenPublication) {
            from components.javaPlatform
        }
    }
	
	repositories {
        maven {
            url = "远程仓库地址"
            // 如果远程仓库是 https 的则不需要下面这句话,http 的需要
			// allowInsecureProtocol true
            credentials {
                username = '远程仓库用户'
                password = '远程仓库密码'
            }
        }
    }
}

因为 jar 都是需要 groupId 和 artifactId 和版本的,而 artifactId 在 settings.gradle 中由 rootProject.name 定义,所以还需要在 build.gradle 中定义 groupId 和 version:

group = "com.test"
version = "1.0.0"

到目前为止,完整的 build.gradle 文件内容如下:

plugins {
	id "java-platform"
	id "maven-publish"
}

group = "com.test"
version = "1.0.0"

dependencies {
	constraints {
		// 比如此处我引入了 commons-lang3 的 jar
		api("org.apache.commons:commons-lang3:3.12.0")
		// 其他的直接向下添加即可
	}
}

publishing {
    publications {
        testPlatform(MavenPublication) {
            from components.javaPlatform
        }
    }
	
	repositories {
        maven {
            url = "远程仓库地址"
            // 如果远程仓库是 https 的则不需要下面这句话,http 的需要
			// allowInsecureProtocol true
            credentials {
                username = '远程仓库用户'
                password = '远程仓库密码'
            }
        }
    }
}

在项目根目录下执行:

# Windows 使用 gradlew.bat 文件
./gradlew clean publishToMavenLocal

之后查看 $M2_HOME/repository/com/test/test-bom/1.0.0,有两个文件就表示成功了:

在这里插入图片描述

使用发布的 BOM

使用 BOM 有两种方式,Gradle 自带的 platform 方法,和 SpringBoot 的插件,叫做 io.spring.dependency-management。这两种方式看个人喜好使用。

Gradle API
api platform("com.test:test-bom:1.0.0")
Springboot 插件

插件稍微复杂些,先引入插件:

buildscripts {
	repositories {
		mavenCentral()
	}
	dependencies {
		// 非官方插件,需要引入 SpringBoot 插件库
		classpath("org.springframework.boot:spring-boot-gradle-plugin:2.7.18")
	}
}

apply plugin: "java"
apply plugin: "io.spring.dependency-management"

然后在 dependencyManagement 引入 BOM 即可:

dependencyManagement {
	imports {
		mavenBom "com.test:test-bom:1.0.0"
	}
}

通过上面两种方式之一引入 BOM 之后,引入BOM 中存在的依赖就不用添加 version 了,如:

// 会自动引入 3.12.0 版本
implementation("org.apache.commons:commons-lang3")

到这里基本功能介绍完了。


那么问题来了,我如果在一个 SpringBoot 项目中使用了 SpringBoot 的依赖和我自定义的依赖,我还要写多个引入吗?

buildscripts dependencies 里面用 classpath 声明的第三方插件仓库也要自己指定版本吗?

buildscripts {
	dependencies {
		classpath("org.springframework.boot:spring-boot-gradle-plugin:2.7.18")
	}
}

imports {
	mavenBom "springboot 的"
	mavenBom "springcloud 的"
	mavenBom "我自己的"
}

太难受了,我就想引入我自己的 BOM,并同时可以直接使用 SpringBoot 和 SpringCloud 的 BOM,这个可以搞。

改造 BOM 项目,添加:

javaPlatform {
    allowDependencies()
}

dependencies {
	constraints {
		// xxx
		// 支持 classpath的
		api("org.springframework.boot:spring-boot-gradle-plugin:2.7.18")
	}
    api platform("org.springframework.boot:spring-boot-dependencies:2.7.18")
    api platform("org.springframework.cloud:spring-cloud-dependencies:2021.0.8")
}

必须注意:不要写到 constraints 里面。

这样重新 publishToMavenLocal 就行了。

打包完成后,buildscripts 的引入方式需要修改一下:

buildscripts {
	dependencies {
		classpath platform("com.test:test-bom:1.0.0")
        classpath("org.springframework.boot:spring-boot-gradle-plugin")
	}
}

到这里,一个 BOM 支配所有依赖版本的项目就完成了,再也不怕依赖升级和维护了。


最后贴一下 BOM 和使用 BOM 的 build.gradle 的完整内容:

// bom build.gradle
plugins {
	id "java-platform"
	id "maven-publish"
}

group = "com.test"
version = "1.0.0"

javaPlatform {
    allowDependencies()
}


dependencies {
	constraints {
		// 比如此处我引入了 commons-lang3 的 jar
		api("org.apache.commons:commons-lang3:3.12.0")
		// 其他的直接向下添加即可

		// 支持 classpath的
		api("org.springframework.boot:spring-boot-gradle-plugin:2.7.18")
	}

    api platform("org.springframework.boot:spring-boot-dependencies:2.7.18")
    api platform("org.springframework.cloud:spring-cloud-dependencies:2021.0.8")

}

publishing {
    publications {
        testPlatform(MavenPublication) {
            from components.javaPlatform
        }
    }
	
	repositories {
        maven {
            url = "远程仓库地址"
            // 如果远程仓库是 https 的则不需要下面这句话,http 的需要
			// allowInsecureProtocol true
            credentials {
                username = '远程仓库用户'
                password = '远程仓库密码'
            }
        }
    }
}
// 使用 BOM 的 build.gradle
buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath platform("com.test:test-bom:1.0.0")
        classpath("org.springframework.boot:spring-boot-gradle-plugin")
    }
}

apply plugin: "java"
apply plugin: "org.springframework.boot"

group = "com.test.web"
version = "1.0"

sourceCompatibility = JavaVersion.VERSION_18
targetCompatibility = JavaVersion.VERSION_18

repositories {
    mavenCentral()
}

dependencies {
    implementation platform("com.test:test-bom:1.0.0")

    // spring boot
    implementation("org.springframework.boot:spring-boot-starter-web")
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1972545.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CIFAR-10 数据集图像分类与可视化

数据准备 CIFAR-10 and CIFAR-100 datasets (toronto.edu)在上述网站中下载Python版本的CIFAR-10数据集。 下载后的压缩包解压后会得到几个文件如下: 对应的data_batch_1 ~ data_batch_5 是划分好的训练数据,每个文件里包含10000张图片,test…

基于SpringBoot + Vue的前后端分离项目-外包平台

项目名称:外包平台 作者的B站地址:程序员云翼的个人空间-程序员云翼个人主页-哔哩哔哩视频 csdn地址:程序员云翼-CSDN博客 1.项目技术栈: 前后端分离的项目 后端:Springboot MybatisPlus 前端:Vue …

达梦数据库安装(DM8)新版 windows11下安装及超详细使用教程

windows11下达梦数据库安装 1、安装参考链接2、存在问题2.1新建表空间失败,详情错误号: -70142.2创建表、视图等 1、安装参考链接 https://blog.csdn.net/u014096024/article/details/134722013 2、存在问题 2.1新建表空间失败,详情错误号: -7014 解决…

掌握 LINQ:通过示例解释 C# 中强大的 LINQ的集运算

文章目录 集运算符原理实战示例1. Union2. Intersect3. Except4. ExceptWith5. Concat6. Distinct 注意事项总结 在C#中,LINQ(Language Integrated Query)提供了丰富的集合操作功能,使得对集合数据进行查询、过滤、排序等操作变得…

从程序员视角浅入浅出了解计算机硬件——内存

前言 内存(Memory)是计算机的重要部件,用于存储数据和指令的重要组件,是冯诺依曼计算机中是的存储器部分。作为与CPU进行沟通的桥梁,内存用于临时存储计CPU中的运算数据,以及与硬盘、网卡等外部组件数据,以便CPU能够快…

STM32卡死、跑飞如何调试确定问题

目录 前言 一、程序跑飞原因 二、调试工具 2.1Registers工具 2.2 Memory工具 2.3 Disassembly工具 2.4 Call Stack工具 三、找到程序跑飞位置 方式一、 方式二、 前言 我们初学STM32的时候代码难免会出现疏忽,导致程序跑飞,不再正常运行&#…

电脑桌面便签软件哪个好,桌面便签如何显示在桌面?

在繁忙的工作日里,一款优秀的电脑桌面便签软件就像是一位贴心的小秘书,帮助你记录重要事项,提醒你不要错过任何细节。那么,哪个电脑桌面便签软件可以帮助我们更好地记录和管理日常工作和学习中的事项呢?又如何将桌面便…

16.搜索框滑块和简单验证

一、一些简单的验证 邮箱验证 <!-- 邮件验证 --><p>邮箱&#xff1a;<input type"email" name"email"></p>邮箱验证框的type是email&#xff0c;在框内&#xff0c;它会自动检测输入内容的格式 &#xff0c;若格式非邮箱格式&…

从分散到整合,细说比特币发展史

原文标题&#xff1a;《Layered Bitcoin》 撰文&#xff1a;Saurabh Deshpande 编译&#xff1a;Chris&#xff0c;Techub News 古往今来&#xff0c;货币在社会中都具有三个关键的功能&#xff1a;财富的储存手段、交换媒介和计量单位。虽然货币的形式在不断变化&#xff0c…

一文了解一下 MindSpeed,MindSpeed 是专为华为昇腾设备设计的大模型分布式加速套件。

https://gitee.com/ascend/MindSpeed Gitee Ascend/MindSpeed 项目&#xff0c;MindSpeed 是针对华为昇腾设备的大模型加速库。 MindSpeed 是专为华为昇腾设备设计的大模型加速库&#xff0c;旨在解决用户在大模型训练过程中遇到的显存资源不足等挑战。该库借鉴了 Megatron、D…

如何理解分布式光纤测温DTS的“实时在线监测”的概念?

实时在线监测是相对于非实时在线监测而言的一种高要求的监测方式。在非实时监测中&#xff0c;我们可以使用手持红外测温仪等设备&#xff0c;在需要时进行开机测量&#xff0c;而在不需要时则可以关机。然而&#xff0c;实时在线监测的目标是要求连续、全天候、每秒都不间断地…

检索增强生成RAG系列10--RAG的实际案例

讲了很多理论&#xff0c;最后来一篇实践作为结尾。本次案例根据阿里云的博金大模型挑战赛的题目以及数据集做一次实践。 完整代码地址&#xff1a;https://github.com/forever1986/finrag.git 本次实践代码有参考&#xff1a;https://github.com/Tongyi-EconML/FinQwen/ 目录 …

我的cesium for UE 踩坑之旅(一)

我的小小历程 创建过程场景搭建引入cesium for UE插件创建空白关卡并添加SunSky照明和FloatingPawn进行场景设置设置cesium token重设场景初始点位置顶层菜单窗口 —>打开cesium ion Assets &#xff0c;从而加入自己的资产 UI制作前端UI页面制作顶部菜单打开内容浏览器窗口…

第100+19步 ChatGPT学习:R实现朴素贝叶斯分类

基于R 4.2.2版本演示 一、写在前面 有不少大佬问做机器学习分类能不能用R语言&#xff0c;不想学Python咯。 答曰&#xff1a;可&#xff01;用GPT或者Kimi转一下就得了呗。 加上最近也没啥内容写了&#xff0c;就帮各位搬运一下吧。 二、R代码实现朴素贝叶斯分类 &#xf…

人工智能ai聊天都有哪些?分享4款智能软件!

在这个科技日新月异的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经悄然渗透到我们生活的方方面面&#xff0c;其中最令人兴奋的莫过于那些能够与人类进行流畅对话的AI聊天软件。它们不仅让交流跨越了物种的界限&#xff0c;更在娱乐、教育、客服等多个领域展现出无…

苹果电脑可以玩什么小游戏 适合Mac电脑玩的休闲游戏推荐

对于游戏爱好者而言&#xff0c;Mac似乎并不是游戏体验的首选平台。这主要是因为相较于Windows系统&#xff0c;Mac上的游戏资源显得相对有限。不过&#xff0c;这并不意味着Mac用户就与游戏世界绝缘。实际上&#xff0c;Mac平台上有着一系列小巧精致且趣味横生的小游戏&#x…

苍穹外卖项目day12(day09)---- 查询历史订单、查询订单详情、取消订单、再来一单(用户端)

目录 用户端历史订单模块&#xff1a; - 查询历史订单 产品原型 业务规则 接口设计 user/OrderController OrderService OrderServiceImpl OrderMapper OrderMapper.xml OrderDetailMapper 功能测试&#xff1a; - 查询订单详情 产品原型 接口设计 OrderControll…

安卓常用控件(下)

ImageView ImageView是用于在界面上展示图片的一个控件&#xff0c;它可以让我们的程序界面变得更加丰富多彩。 属性名描述id给当前控件定义一个唯一的标识符。layout_width给控件指定一个宽度。match_parent&#xff1a;控件大小与父布局一样&#xff1b;wrap_content&#x…

【两数相加】python刷题记录

R3-链表-链表高精度加法 目录 递归法 迭代 递归法 l1.vall2.valcarry&#xff0c;得到的和&#xff0c;%10为当前位存储的值&#xff0c;除以10为当前的进位值 # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # …

SpringMVC和Spring

1.AOP 1.基础内容 AOP是面向切面的的编程&#xff0c;AOP 是一种编程思想&#xff0c;是面向对象编程&#xff08;OOP&#xff09;的一种补充。 面向切面编程&#xff0c;实现在不修改源代码的情况下给程序动态统一添加额外功能的一种技术&#xff08;增强代码&#xff09;&…