Java使用Maven BOM統(tǒng)一管理版本號(hào)的實(shí)現(xiàn)
一個(gè)中大型的 Java 項(xiàng)目往往包含若干 JAR 包,這些 JAR 包有著不同的版本號(hào)。如果這些 JAR 包單獨(dú)發(fā)布,然后直接通過(guò)版本號(hào)引用相應(yīng)的 JAR 包,不同版本的兼容性維護(hù)將變得十分麻煩。為了解決這個(gè)問(wèn)題,可以讓一個(gè)特殊的模塊引用這些 JAR 包,將版本號(hào)定義在這個(gè)模塊中,模塊中的 JAR 都是兼容的,對(duì)外發(fā)布時(shí)只發(fā)布這個(gè)特殊模塊。這個(gè)特殊模塊就是 BOM(Bill Of Materials)。
著名的 Spring Boot 就使用了這種方式來(lái)管理版本號(hào),這個(gè)模塊就是 spring-boot-dependencies,用戶在使用 Spring Boot Starter 相關(guān)依賴時(shí)引入特定版本的 spring-boot-dependencies,然后在引入其它依賴時(shí)只需要聲明 group 和 name 即可,不需要再指定版本號(hào)了。當(dāng)然,在 Gradle 中使用 Spring Boot 插件,或者在 Maven 中使用 spring-boot-starter-parent 作為父模塊也能夠達(dá)到類似的效果。
本文將介紹如何通過(guò) Gradle 來(lái)制作一個(gè) BOM 以及如何在 Gradle 中使用 BOM。作為 Maven 中的一個(gè)概念,也可以使用 Maven 也可以制作和使用 BOM,但本文不涉及。
1. BOM 介紹
BOM (Bill Of Material) 是 Maven 倉(cāng)庫(kù)中的一個(gè)概念,它本質(zhì)也是一個(gè)可被引用的包,但不包含代碼,只是聲明了一系列其它包。例如:Maven 中央倉(cāng)庫(kù)中的 spring-boot-dependencies](https://repo1.maven.org/maven2/org/springframework/boot/spring-boot-dependencies/2.4.4/) 包。它只有一個(gè) .pom 文件。
下面是 Maven 官網(wǎng)上的一個(gè)簡(jiǎn)單的 BOM 的 .pom 文件:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>bom</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<properties>
<project1Version>1.0.0</project1Version>
<project2Version>1.0.0</project2Version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.test</groupId>
<artifactId>project1</artifactId>
<version>${project1Version}</version>
</dependency>
<dependency>
<groupId>com.test</groupId>
<artifactId>project2</artifactId>
<version>${project2Version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<modules>
<module>parent</module>
</modules>
</project>
這個(gè)文件聲明了兩個(gè)包(project1 和 project2)及其版本號(hào),和一般 .pom 文件中的聲明不同的是, 節(jié)點(diǎn)外面還包含了一層 節(jié)點(diǎn)。以上就是 BOM 包中最核心的文件的基本結(jié)構(gòu)了;基于 Gradle 發(fā)布 BOM 包的本質(zhì)就是生成這樣的一個(gè)文件。
2. 使用 Gradle 制作一個(gè) BOM
這里我們假定要?jiǎng)?chuàng)建一個(gè) BOM,用來(lái)統(tǒng)一管理三方 Java 包,其它業(yè)務(wù)模塊通過(guò)引用這個(gè) BOM 來(lái)間接引用需要使用的第三方 Java 包。工程完整代碼:https://github.com/Robothy/gradle-bom-example
2.1 創(chuàng)建 BOM 工程
Gradle 中的 BOM 工程需要使用 java-platform 插件,這樣的工程是一個(gè)不包含源代碼,只包含包聲明的特殊的組件,也被稱為平臺(tái)(platform)。
build.gradle 部分代碼
plugins {
id 'java-platform'
}
dependencies {
constraints {
// 聲明一些三方包及其版本號(hào)
api "org.apache.kafka:kafka-clients:2.6.0"
api "redis.clients:jedis:3.5.2"
}
}
上面代碼中,三方包的聲明沒(méi)有放在 dependencies 中,而是放在了 constraints 里面。這表示如果使用了其中的包,優(yōu)先使用 constraints 中聲明的版本。
BOM 項(xiàng)目中聲明包的方式有兩種:
- api 表示包在編譯期可見。
- runtime 表示包在運(yùn)行期間可見。
2.2 BOM 的發(fā)布
BOM 的發(fā)布需要使用 maven-publish 插件,其發(fā)布配置如下:
publishing {
publications {
thirdPartPlatform(MavenPublication){
from components.javaPlatform
artifactId = "third-part-dependencies"
}
}
repositories {
mavenLocal()
}
}
BOM 的命名一般以 -dependencies 結(jié)尾,這里我們?nèi)∶麨?third-part-dependnecies。
執(zhí)行 ./gradlew.bat publish 就可以將 BOM 發(fā)布到本地的 Maven 倉(cāng)庫(kù)了。發(fā)布的 artifacts 包含兩個(gè)主要文件(.pom 和 .module)和若干校驗(yàn)文件。其中 .pom 的文件內(nèi)容為 Maven 官方定義的 BOM 的標(biāo)準(zhǔn)格式,而.module 文件內(nèi)容是 Gradle 描述元數(shù)據(jù)的一種格式。
2.3 BOM 的使用
普通的 Java 應(yīng)用或者 Java 庫(kù)使用 BOM 的時(shí)候需要先添加 BOM 依賴,然后使用其它的庫(kù)。例如:
// 引入 BOM
implementation platform("org.example:third-part-dependencies:1.0")
// 引入包,這時(shí)不需要再指定版本號(hào)
implementation "org.apache.kafka:kafka-clients"
當(dāng)然,BOM 工程或者說(shuō) platform 工程也可以使用 BOM。
使用的時(shí)候需要在 dependencies 下面引入 BOM,然后在 constraints 下面聲明要使用的庫(kù),聲明的時(shí)候無(wú)須指定版本。另外,需要在 configurations 中調(diào)用 javaPlatform.allowDependencies(),否則會(huì)報(bào)錯(cuò)。
configurations{
javaPlatform.allowDependencies()
}
dependencies {
api platform("org.springframework.boot:spring-boot-dependencies:2.4.4")
constraints {
api "org.apache.kafka:kafka-clients:2.6.0"
api "redis.clients:jedis:3.5.2"
api "org.springframework.batch:spring-batch-core"
}
}
3 參考
[1] Introduction to the Dependency Mechanism
到此這篇關(guān)于Java使用Maven BOM統(tǒng)一管理版本號(hào)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Maven BOM統(tǒng)一管理版本號(hào)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
有關(guān)ServletConfig與ServletContext的訪問(wèn)
下面小編就為大家?guī)?lái)一篇有關(guān)ServletConfig與ServletContext的訪問(wèn)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01
Java--SSH,SSM和Spring?Boot框架區(qū)別及優(yōu)缺點(diǎn)說(shuō)明
這篇文章主要介紹了Java--SSH,SSM和Spring?Boot框架區(qū)別及優(yōu)缺點(diǎn)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
Java中String的JdbcTemplate連接SQLServer數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了Java中String的JdbcTemplate連接SQLServer數(shù)據(jù)庫(kù)的方法,在研發(fā)過(guò)程中我們需要與其他系統(tǒng)對(duì)接的場(chǎng)景,連接SQLServer拉取數(shù)據(jù),所以就用jdbc連接數(shù)據(jù)庫(kù)的方式連接外部數(shù)據(jù)源,需要的朋友可以參考下2021-10-10
Java獲取服務(wù)器IP及端口的方法實(shí)例分析
這篇文章主要介紹了Java獲取服務(wù)器IP及端口的方法,結(jié)合實(shí)例形式分析了java針對(duì)客戶端及服務(wù)器端各種常見的信息操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-12-12
一文詳解SpringBoot使用Kafka如何保證消息不丟失
這篇文章主要為大家詳細(xì)介紹了SpringBoot使用Kafka如何保證消息不丟失的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考一下2025-01-01
解析Java編程之Synchronized鎖住的對(duì)象
這篇文章主要介紹了解析Java編程之Synchronized鎖住的對(duì)象,具有一定參考價(jià)值,需要的朋友可以了解下。2017-10-10
Java數(shù)據(jù)結(jié)構(gòu)之鏈表(動(dòng)力節(jié)點(diǎn)之Java學(xué)院整理)
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之鏈表(動(dòng)力節(jié)點(diǎn)之Java學(xué)院整理)的相關(guān)資料,需要的朋友可以參考下2017-04-04

