2022-6月更文挑战4-springcloud父子项目中多module及依赖继承问题

238 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

springcloud父子项目中多module及依赖继承问题

前文

本文内容主要是讨论父子项目中内容的互相依赖问题。由于springcloud经常采用父子项目的方式进行构建,构建中代码的共享则成为了一个值得关注的问题。如何以最少的方式引入第三方jar包,以及如何使得项目间能够完成对同一份代码的应用,也就成为了项目搭建阶段的一个关注点。本文将从几个角度进行该内容的总结,但很可能不够完善。

子模块如何从父项目中进行第三方jar包的继承

首先讨论一个最常见的问题,也就是如何简化子模块的构建,直接从父项目中获取第三方jar的内容直接进行应用。以springcloud为例,很明显每个子模块都要引入springcloud及springboot启动相关的基础内容,那么其实我们只需要在父项目的pom中进行引用,子模块也就直接可以使用避免反复操作。

<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-bootstrap</artifactId>
  </dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

子模块如何引入其他模块

对于一个springcloud项目来说,很明显我们会有一些共享的工具类,以及拦截器等等各服务共有的信息。那么如果按照传统方式,每个服务都进行代码的编写,一旦需要进行内容的修改时,需要对每一个模块中的代码都进行一次改动,显然这是一个比较差的方案。因此最好的方案则是通过一个模块,各模块像引用jar包一样引用该服务也就能够达到共享的效果。那么具体如何操作呢,只需要在子模块的dependency中进行该共有模块引用,如下所示,也就能够完成各模块共享同一段代码,避免了代码的重复修改问题。

<dependency>
  <groupId>com.mountain.sea</groupId>
  <artifactId>base-core</artifactId>
  <version>1.0-SNAPSHOT</version>
</dependency>

各子模块如何进行共有版本指定

再看另一个问题,倘若有些模块只有部分服务需要引入,那么版本如何保持一致呢?显然这种非广泛性质的依赖不适合在父pom中直接引用。这种情况选择在父pom中采用dependencyManagement进行版本指定而不进行实际的引用,当子模块需要时,直接引入即可,不需要重复进行版本指定,也就能够实现版本的一致性,统一在父pom中配置。

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>${mybatis.starter.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。