Gradle 统一管理依赖

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 的 jarapi("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 truecredentials {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 的 jarapi("org.apache.commons:commons-lang3:3.12.0")// 其他的直接向下添加即可}
}publishing {publications {testPlatform(MavenPublication) {from components.javaPlatform}}repositories {maven {url = "远程仓库地址"// 如果远程仓库是 https 的则不需要下面这句话,http 的需要// allowInsecureProtocol truecredentials {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 的 jarapi("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 truecredentials {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_18repositories {mavenCentral()
}dependencies {implementation platform("com.test:test-bom:1.0.0")// spring bootimplementation("org.springframework.boot:spring-boot-starter-web")
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ARM 离线安装k8s + harbor私有镜像库(麒麟)

目录 1.1 K8S 服务集群安装部署 1.1.1 主机配置说明 1.1.2 主机名称、host配置 1.1.3 防火墙配置 1.1.4 关闭selinux 1.1.5 配置内核转发及网桥过滤 1.1.6 关闭SWAP分区 1.1.7 安装ipset及ipvsadm 1.1.8 时间同步(麒麟系统自带了chronyd) 1.1.9 docker安装 1.1.10 …

用户画像系列——Spark任务调优实践

在画像标签的加工和写入hbase中,我们采用了spark来快速进行处理和写入。但是在实际线上运行的过程中,仍然遇到了不少问题,下面来总结下遇到的一些问题 1.数据倾斜问题 其实spark 数据倾斜思路和hive、mapreduce 数据倾斜思路处理类似&…

ELK对业务日志进行收集

ELK对业务日志进行收集 下载httpd 进到文件设置收集httpd的文件进行 设置 编辑内容 用于收集日志的内容 将日志的内容发送到实例当中 input {file{path > /etc/httpd/logs/access_logtype > "access"start_position > "beginning"}file{path &g…

基于SpringCloud alibaba的流媒体视频点播平台

基于SpringCloud alibaba的流媒体视频点播平台 前言整体架构具体实现视频播放 总结 先把项目地址放这 》基于SpringCloud alibaba的流媒体视频点播平台《 然后咱们来看看这个项目是干啥的。 前言 今天和大家分享一个项目,基于SpringCloud alibaba的流媒体视频点…

嵌入式单片机中在线调试工具使用方法

大家好,相信很多小伙伴都听说过,或者用过SystemView这款工具。 它是一个可以在线调试嵌入式系统的工具,它可以分析RTOS有哪些中断、任务执行了,以及这些中断、任务执行的先后关系。 还可以查看一些内核对象持有和释放的时间点,比如信号量、互斥量、事件、消息队列等,这在…

紫辉创投开启Destiny of Gods首轮投资,伯乐与千里马的故事仍在继续

近日,上海紫辉创业投资有限公司(以下简称“紫辉创投”)宣布开启GameFi链游聚合平台Destiny of Gods首轮投资500,000美金,并与其达成全面战略及业务层合作,双方将协同布局链上生态,共同推动链游行业健康发展…

开发板与ubuntu不能ping通怎么办?

TOC 第一步:VMware 设置 打开 VMware Workstation Pro 里的 虚拟机 -> 设置 设置网络适配器为桥接模式。这里不要勾选“复制物理网络连接状态”。 因为电脑是 WiFi 上网,所以需要添加一个网络适配器并设置成 NAT 模式,供虚拟机上网。具…

C#:枚举及位标志周边知识详解(小白入门)

文章目录 枚举为什么要有枚举?枚举的性质设置默认类型和显式设置成员的值 位标志(重要)位标记是什么及作用位标志周边知识HasFlag判断是否有该功能枚举前面加Flags的好处 关于枚举的更多知识using static简化代码获取枚举成员的字面量 枚举 为什么要有枚举? 为了增加代码的…

ComfyUI 实战教程:一键扩图

大家好,我是每天分享AI应用的萤火君! 本文给大家分享一个很有用的技术:AI扩图。所谓扩图就是扩展图像的边界,在图像的边界外新增更多画面元素,这不仅仅是扩大图像的尺寸,还要让新添加的部分与原有图像的内…

xss漏洞(二,xss入靶场搭建以及简单利用)

本文仅作为学习参考使用,本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 一,环境搭建。 使用工具:PHP study,dvwa靶场。 1,GitHub上下载dvwa到PHP study的WWW文件夹内,并解压。 dvwa下载地址 …

区块链核心概念与技术架构简介

引言 区块链,一种分布式账本技术,不仅为数字货币提供了基础设施,更在金融、供应链、物联网等多个领域展现出广泛的应用前景。区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。 如果说蒸汽机释放了人们的…

[网鼎杯 2020 青龙组]AreUSerialz1

打开题目 熟悉的php,代码审计 可知这是一题反序列化类型的题目。 按照常规方法,首先,我们先将代码复制到本地进行序列化构造, 根据代码逻辑分析,咱们可知 function __construct() { $op "1"…

深入理解操作系统--绪论

文章目录 概述操作系统的基本概念多用户系统用户和组进程 小结 概述 最近在读操作系统,发现一些新的概念。写出来,让自己印象更深,希望也帮助一些不懂的朋友;但愿有所帮助吧。 操作系统的基本概念 计算机都包含操作系统的基本程…

Docker 安装 GitLab教程

本章教程,主要介绍如何在Docker 中安装GitLab。 GitLab 是一个开源的 DevOps 平台,提供了一整套工具,用于软件开发生命周期的各个阶段,从代码管理到 CI/CD(持续集成和持续交付/部署),再到监控和安全分析。 一、拉取镜像 docker pull gitlab/gitlab-ce:latest二、创建 G…

Photoshop 运行时常见问题及修复

安装完成后无法运行 出现“由于找不到 MSVCP140.dll,无法继续执行代码。重新安装程序可能会解决此问题。”等问题时,可以从网上搜索 Microsoft Visual C 运行库,下载并安装,一般可解决问题。 暂存盘不够的问题 软件在运算过程中会…

UE5 敌人血条

这样处理就完毕,然后 User Widget 尽可能分成多个进行处理

vue2-级联选择器

级联选择器 一、市面上的级联选择器二、功能实现1、数据类型2、隐藏下拉框的方法3、html结构4、CSS代码5、各个方法代码 三、实现样式截图1、一级菜单1、鼠标放到一级菜单,就显示二级菜单2、鼠标点击一级菜单的时候 2、二级菜单1、鼠标放到二级菜单的时候&#xff0…

Java中的二叉搜索树(如果想知道Java中有关二叉搜索树的知识点,那么只看这一篇就足够了!)

前言:Java 提供了丰富的数据结构来处理和管理数据,其中 TreeSet 和 TreeMap 是基于红黑树实现的集合和映射接口。它们有序地存储数据,提供高效的搜索、插入和删除操作。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主…

软件测试 -- 黑盒、灰盒、白盒测试,冒烟测试、回归测试

软件测试目的:查找软件中缺陷(bug),保障软件质量。

MyBatis 动态代理和映射器

一、映射器简介 1.什么是mapper动态代理? 在接口中有方法的返回值定义,参数的定义,方法名,在sqlMapper.xml 中也对应这接口给予了赋值, 这时候dao的实现类就显得多余,这是Mybatis可以帮助我们自动产生实现类&#xf…