乐趣区

关于经验:干货自己开发了一个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 的形式提供的。整个对接流程只须要两步:

1、须要将二方库包推送至 maven 仓库

2、其余事业部只须要增加二方库包的 maven 坐标

这里会有一些小细节:二方库包是一个我的项目工程,也会依赖一些二方库、三方库的状况。通常,二方库外部依赖的 jar 包的 scope 都会设置为 provider(默认零碎曾经提供,不将二方库包外部依赖的 jar 包与对接方的我的项目耦合 ),然而不乏会呈现对接方无增加过相干依赖的状况,因而 须要增加合乎对接方零碎版本的依赖。接下来,将以一个 springboot 引入 spring-kafka 的案例来了解如何找到适合的 spring-kafka 版本。

一、为什么 maven 会找不到 spring-kafka 的版本?

  • 假如这么一个场景:我开发的二方库包应用到的技术栈是 springboot,外部开发的其中一个性能须要依赖 spring-kafka 的三方库。家喻户晓,springboot 为咱们提供了及其舒服的开发环境,当咱们引入 springboot 框架后,它外部曾经定义了合乎以后版本的所有三方库依赖。因而,假如咱们要引入 spring-kafka 模块,只须要在 pom.xml 文件中增加如下坐标即可:

    <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 版本。

二、如何找到 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 外部依赖了哪些类库,咱们能够这么定位:

    1. 定位版本

    2. 查看依赖 pom 文件

    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 中批改版本号再下载对应的版本不便的多。

三、总结

  • 一种定位依赖版本的另外一种解决方案,如果你感觉我的文章有用的话,欢送点赞、珍藏和关注。
  • I’m a slow walker, but I never walk backwards
退出移动版