亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java使用Maven BOM統(tǒng)一管理版本號(hào)的實(shí)現(xiàn)

 更新時(shí)間:2021年04月20日 10:50:49   作者:Robothy  
這篇文章主要介紹了Java使用Maven BOM統(tǒng)一管理版本號(hào)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一個(gè)中大型的 Java 項(xiàng)目往往包含若干 JAR 包,這些 JAR 包有著不同的版本號(hào)。如果這些 JAR 包單獨(dú)發(fā)布,然后直接通過版本號(hào)引用相應(yīng)的 JAR 包,不同版本的兼容性維護(hù)將變得十分麻煩。為了解決這個(gè)問題,可以讓一個(gè)特殊的模塊引用這些 JAR 包,將版本號(hào)定義在這個(gè)模塊中,模塊中的 JAR 都是兼容的,對(duì)外發(fā)布時(shí)只發(fā)布這個(gè)特殊模塊。這個(gè)特殊模塊就是 BOM(Bill Of Materials)。

著名的 Spring Boot 就使用了這種方式來管理版本號(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á)到類似的效果。

本文將介紹如何通過 Gradle 來制作一個(gè) BOM 以及如何在 Gradle 中使用 BOM。作為 Maven 中的一個(gè)概念,也可以使用 Maven 也可以制作和使用 BOM,但本文不涉及。

1. BOM 介紹

BOM (Bill Of Material) 是 Maven 倉庫中的一個(gè)概念,它本質(zhì)也是一個(gè)可被引用的包,但不包含代碼,只是聲明了一系列其它包。例如:Maven 中央倉庫中的 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,用來統(tǒng)一管理三方 Java 包,其它業(yè)務(wù)模塊通過引用這個(gè) BOM 來間接引用需要使用的第三方 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"
    }
}

上面代碼中,三方包的聲明沒有放在 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 倉庫了。發(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 庫使用 BOM 的時(shí)候需要先添加 BOM 依賴,然后使用其它的庫。例如:

// 引入 BOM
implementation platform("org.example:third-part-dependencies:1.0")

// 引入包,這時(shí)不需要再指定版本號(hào)
implementation "org.apache.kafka:kafka-clients"

當(dāng)然,BOM 工程或者說 platform 工程也可以使用 BOM。

使用的時(shí)候需要在 dependencies 下面引入 BOM,然后在 constraints 下面聲明要使用的庫,聲明的時(shí)候無須指定版本。另外,需要在 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

[2] The Java Platform Plugin

到此這篇關(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)文章

  • 如何通過Java添加水印到Word文檔

    如何通過Java添加水印到Word文檔

    這篇文章主要介紹了如何通過Java添加水印到Word文檔,水印是一種常用于各種文檔的聲明、防偽手段,一般可設(shè)置文字水印或者加載圖片作為水印。以下內(nèi)容將分享通過Java編程給Word文檔添加水印效果的方法,需要的朋友可以參考下
    2019-07-07
  • Java中的set集合是什么意思

    Java中的set集合是什么意思

    這篇文章主要介紹了Java中的set集合是什么意思,詳細(xì)地講解一下Collection集合中的另外一個(gè)分支——Set系列集合,需要的朋友可以參考下
    2022-05-05
  • Spring Boot兩種全局配置和兩種注解的操作方法

    Spring Boot兩種全局配置和兩種注解的操作方法

    Spring Boot使用一個(gè)application.properties或者application.yaml的文件作為全局配置文件,本文重點(diǎn)給大家介紹Spring Boot兩種全局配置和兩種注解的配置方法,感興趣的朋友一起看看吧
    2021-06-06
  • Springboot使用MybatisPlus實(shí)現(xiàn)mysql樂觀鎖

    Springboot使用MybatisPlus實(shí)現(xiàn)mysql樂觀鎖

    MySQL中的樂觀鎖(Optimistic?Locking)是一種并發(fā)控制策略,本文將使用Springboot和MybatisPlus實(shí)現(xiàn)MySQL中的樂觀鎖,需要的可以參考下
    2024-12-12
  • Spring Boot 連接LDAP的方法

    Spring Boot 連接LDAP的方法

    這篇文章主要介紹了Spring Boot 連接LDAP的方法,僅僅涉及基本的使用ODM來快速實(shí)現(xiàn)LDAP增刪改查操作。具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-12-12
  • Java中數(shù)學(xué)相關(guān)類的使用教程

    Java中數(shù)學(xué)相關(guān)類的使用教程

    Java是一種廣泛使用的編程語言,它提供了許多數(shù)學(xué)運(yùn)算的函數(shù)和方法,使得開發(fā)者可以輕松地進(jìn)行各種數(shù)學(xué)計(jì)算,下面這篇文章主要給大家介紹了關(guān)于Java中數(shù)學(xué)相關(guān)類使用的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • Java線程同步實(shí)例分析

    Java線程同步實(shí)例分析

    這篇文章主要介紹了Java線程同步用法,實(shí)例分析了java中線程同步的相關(guān)實(shí)現(xiàn)技巧與注意事項(xiàng),具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • Java控制臺(tái)實(shí)現(xiàn)猜拳游戲

    Java控制臺(tái)實(shí)現(xiàn)猜拳游戲

    這篇文章主要為大家詳細(xì)介紹了Java控制臺(tái)實(shí)現(xiàn)猜拳游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • Java線程池7個(gè)參數(shù)的含義

    Java線程池7個(gè)參數(shù)的含義

    這篇文章主要介紹了Java線程池7個(gè)參數(shù)的含義,所謂的線程池的?7?大參數(shù)是指,在使用?ThreadPoolExecutor?創(chuàng)建線程池時(shí)所設(shè)置的?7?個(gè)參數(shù),下文更多詳細(xì)內(nèi)容,需要的小伙伴可以參考一下
    2022-05-05
  • 淺析Spring基于注解的AOP

    淺析Spring基于注解的AOP

    Spring是一個(gè)廣泛應(yīng)用的框架,SpringAOP則是Spring提供的一個(gè)標(biāo)準(zhǔn)易用的aop框架,依托Spring的IOC容器,提供了極強(qiáng)的AOP擴(kuò)展增強(qiáng)能力,對(duì)項(xiàng)目開發(fā)提供了極大地便利
    2022-11-11

最新評(píng)論