Java使用Maven BOM統一管理版本號的實現
一個中大型的 Java 項目往往包含若幹 JAR 包,這些 JAR 包有著不同的版本號。如果這些 JAR 包單獨發佈,然後直接通過版本號引用相應的 JAR 包,不同版本的兼容性維護將變得十分麻煩。為瞭解決這個問題,可以讓一個特殊的模塊引用這些 JAR 包,將版本號定義在這個模塊中,模塊中的 JAR 都是兼容的,對外發佈時隻發佈這個特殊模塊。這個特殊模塊就是 BOM(Bill Of Materials)。
著名的 Spring Boot 就使用瞭這種方式來管理版本號,這個模塊就是 spring-boot-dependencies,用戶在使用 Spring Boot Starter 相關依賴時引入特定版本的 spring-boot-dependencies,然後在引入其它依賴時隻需要聲明 group 和 name 即可,不需要再指定版本號瞭。當然,在 Gradle 中使用 Spring Boot 插件,或者在 Maven 中使用 spring-boot-starter-parent 作為父模塊也能夠達到類似的效果。
本文將介紹如何通過 Gradle 來制作一個 BOM 以及如何在 Gradle 中使用 BOM。作為 Maven 中的一個概念,也可以使用 Maven 也可以制作和使用 BOM,但本文不涉及。
1. BOM 介紹
BOM (Bill Of Material) 是 Maven 倉庫中的一個概念,它本質也是一個可被引用的包,但不包含代碼,隻是聲明瞭一系列其它包。例如:Maven 中央倉庫中的 spring-boot-dependencies](https://repo1.maven.org/maven2/org/springframework/boot/spring-boot-dependencies/2.4.4/) 包。它隻有一個 .pom 文件。
下面是 Maven 官網上的一個簡單的 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>
這個文件聲明瞭兩個包(project1 和 project2)及其版本號,和一般 .pom 文件中的聲明不同的是, 節點外面還包含瞭一層 節點。以上就是 BOM 包中最核心的文件的基本結構瞭;基於 Gradle 發佈 BOM 包的本質就是生成這樣的一個文件。
2. 使用 Gradle 制作一個 BOM
這裡我們假定要創建一個 BOM,用來統一管理三方 Java 包,其它業務模塊通過引用這個 BOM 來間接引用需要使用的第三方 Java 包。工程完整代碼:https://github.com/Robothy/gradle-bom-example
2.1 創建 BOM 工程
Gradle 中的 BOM 工程需要使用 java-platform 插件,這樣的工程是一個不包含源代碼,隻包含包聲明的特殊的組件,也被稱為平臺(platform)。
build.gradle 部分代碼
plugins { id 'java-platform' } dependencies { constraints { // 聲明一些三方包及其版本號 api "org.apache.kafka:kafka-clients:2.6.0" api "redis.clients:jedis:3.5.2" } }
上面代碼中,三方包的聲明沒有放在 dependencies 中,而是放在瞭 constraints 裡面。這表示如果使用瞭其中的包,優先使用 constraints 中聲明的版本。
BOM 項目中聲明包的方式有兩種:
- api 表示包在編譯期可見。
- runtime 表示包在運行期間可見。
2.2 BOM 的發佈
BOM 的發佈需要使用 maven-publish 插件,其發佈配置如下:
publishing { publications { thirdPartPlatform(MavenPublication){ from components.javaPlatform artifactId = "third-part-dependencies" } } repositories { mavenLocal() } }
BOM 的命名一般以 -dependencies 結尾,這裡我們取名為 third-part-dependnecies。
執行 ./gradlew.bat publish 就可以將 BOM 發佈到本地的 Maven 倉庫瞭。發佈的 artifacts 包含兩個主要文件(.pom 和 .module)和若幹校驗文件。其中 .pom 的文件內容為 Maven 官方定義的 BOM 的標準格式,而.module 文件內容是 Gradle 描述元數據的一種格式。
2.3 BOM 的使用
普通的 Java 應用或者 Java 庫使用 BOM 的時候需要先添加 BOM 依賴,然後使用其它的庫。例如:
// 引入 BOM implementation platform("org.example:third-part-dependencies:1.0") // 引入包,這時不需要再指定版本號 implementation "org.apache.kafka:kafka-clients"
當然,BOM 工程或者說 platform 工程也可以使用 BOM。
使用的時候需要在 dependencies 下面引入 BOM,然後在 constraints 下面聲明要使用的庫,聲明的時候無須指定版本。另外,需要在 configurations 中調用 javaPlatform.allowDependencies(),否則會報錯。
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
[2] The Java Platform Plugin
到此這篇關於Java使用Maven BOM統一管理版本號的實現的文章就介紹到這瞭,更多相關Maven BOM統一管理版本號內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- None Found