乾貨:本身開發了一個starter,如何輕鬆嵌入到使用不一樣版本的springboot框架的對接方

背景

  • 最近應公司需求,開發了一個公司內部共用的二方庫包。這裏科普下:什麼叫一方庫,二方庫,三方庫。在阿里巴巴出品的 泰山版《Java開發手冊》 附 2:專有名詞解釋章節中有提到
  • 一方庫:本工程內部子項目模塊依賴的庫(jar 包)
依賴本工程內部的 common模塊,裏面一般會定義一些全部模塊都會用到的一些基礎功能,好比 全局異常碼、分佈式鎖、統一響應實體等等
  • 二方庫:公司內部發布到中央倉庫,可供公司內部其它應用依賴的庫(jar 包)
在互聯網公司一般都是分事業部的,而後會存在一個叫 基礎部門/基礎中心的事業部,這個部門可能會提供一些公司的基本類庫,eg:mq相關的統一的amqp操做、rpc相關的統一的dubbo操做等等。最終這些都會以jar包的形式推送到maven倉庫(公司內部須要搭建專有的maven倉庫)。如今是spring boot的時代,若是公司用的是springboot這一套體系的話,這些jar包一般是以starter的方式提供,再利用springboot的自動裝配機制,其餘事業部能夠很方便的對接。
  • 三方庫:公司以外的開源庫(jar 包)
常見的springboot、mybatis

因爲公司內部使用的是springboot相關的技術棧,所以,我開發的二方庫包是以starter的方式提供的。整個對接流程只須要兩步:spring

一、須要將二方庫包推送至maven倉庫springboot

二、其餘事業部只須要添加二方庫包的maven座標mybatis

這裏會有一些小細節:二方庫包是一個項目工程,也會依賴一些二方庫、三方庫的狀況。一般,二方庫內部依賴的jar包的scope都會設置爲provider(默認系統已經提供,不將二方庫包內部依賴的jar包與對接方的項目耦合),可是不乏會出現對接方無添加過相關依賴的狀況,所以須要添加符合對接方系統版本的依賴。接下來,將以一個springboot引入spring-kafka的案例來理解如何找到合適的spring-kafka版本。框架

1、爲何maven會找不到spring-kafka的版本?

  • 假設這麼一個場景:我開發的二方庫包使用到的技術棧是springboot,內部開發的其中一個功能須要依賴spring-kafka的三方庫。衆所周知,springboot爲咱們提供了及其溫馨的開發環境,當咱們引入springboot框架後,它內部已經定義了符合當前版本的全部三方庫依賴。所以,假設咱們要引入spring-kafka模塊,只須要在pom.xml文件中添加以下座標便可:maven

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    <!-- 只須要添加以下座標便可,不須要指定版本 -->
    <dependencies>
        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
        </dependency>
    </dependencies>

在上述引入spring-kafka 模塊時,咱們沒有指定version也可使用。這是由於spring-boot-starter-parent內部的dependencyManagement中定義了spring-kafka的依賴,做爲子模塊,只須要引入便可,版本號會默認繼承父工程中的定義。若是對接方使用的是springboot 1.4.1.RELEASE版本,這個時候,再使用一樣的方式來引入spring-kafka的話,你會發現,maven找不到spring-kafka的版本:分佈式

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.1.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<!-- 只須要添加以下座標便可,不須要指定版本 -->
<dependencies>
    <dependency>
        <groupId>org.springframework.kafka</groupId>
        <artifactId>spring-kafka</artifactId>
    </dependency>
</dependencies>

其大體的緣由就是:在spring-boot-starter-parent中內部並無依賴過spring-kafka,所以沒法繼承父類定義的版本,最終maven會提示找不到對應的版本。對接方一直以springboot 1.4.1.RELEASE版本正常開發,不可能爲了集成你的二方庫而升級springboot版本吧?所以,咱們須要爲對接方找到合適的spring-kafka版本。ide

2、如何找到springboot 1.4.1.RELEASE內部的依賴

  • 其中最簡單的一種方法就是在idea中找到對應的pom文件定義,這是一種方式。可是做爲一個二方庫提供者,後續可能會常常要處理因業務側springboot版本不一樣而致使沒法引入spring-kafka的問題。難道咱們要本地每次修改maven中springboot的版本,經過maven下載後再使用idea查看嗎?這顯然有點麻煩。
  • 還有一種作法是找官方springboot 1.4.1.RELEASE的文檔,但連maven依賴中都沒有涉及kafka,大機率是此版本沒有集成kafka。
  • 另一種作法就是:參考此連接https://repo1.maven.org/maven2/org/springframework/boot/spring-boot-dependencies/。在此連接中,是springboot的全部版本的依賴,如今咱們要看1.4.1.RELEASE版本的springboot內部依賴了哪些類庫,咱們能夠這麼定位:spring-boot

    1. 定位版本idea

      在這裏插入圖片描述

    2. 查看依賴pom文件spa

      在這裏插入圖片描述

    3. 善於搜索(搜索spring-kafka)

      在這裏插入圖片描述

      能夠看到,在springboot 1.4.1.RELEASE版本中內部並無依賴spring-kafka。此時該怎麼辦呢?將springboot版本升級,繼續日後搜索,最終你會發現,在1.5.0.RELEASE版本中內部開始依賴了spring-kafka。所以,咱們能夠嘗試,在maven中引入查找出來的版本1.1.2.RELEASE

      在這裏插入圖片描述

      對應的pom.xml文件爲

      <dependency>
          <groupId>org.springframework.kafka</groupId>
          <artifactId>spring-kafka</artifactId>
          <version>1.1.2.RELEASE</version>
      </dependency>
在這種場景下,引入**1.1.2.RELEASE**版本能夠解決問題,對接方的系統也能正常工做。

也許這種方式在其餘場景不適用,但這確實是一種方式,咱們能夠經過https://repo1.maven.org/maven2/org/springframework/boot/spring-boot-dependencies/連接找到每一個springboot版本內部依賴的三方庫,這比咱們在idea中修改版本號再下載對應的版本方便的多。

3、總結

  • 一種定位依賴版本的另一種解決方案,若是你以爲個人文章有用的話,歡迎點贊、收藏和關注。
  • I'm a slow walker, but I never walk backwards
相關文章
相關標籤/搜索