SpringCloud Alibaba 微服务实战四 - 版本管理

本贴最后更新于 1838 天前,其中的信息可能已经时移世易

导读:本篇作为 SpringCloud Alibaba 微服务实战系列的第四篇,我们对之前的微服务框架进行优化,通过 Maven bom 机制管理所有组件的版本。

BOM 简介

BOM(Bill of Materials)是由 Maven 提供的功能,它通过定义一整套相互兼容的 jar 包版本集合,使用时只需要依赖该 BOM 文件,即可放心的使用需要的依赖 jar 包,且无需再指定版本号。BOM 的维护方负责版本升级,并保证 BOM 中定义的 jar 包版本之间的兼容性。

为什么要使用 BOM

使用 BOM 除了可以方便使用者在声明依赖的客户端时不需要指定版本号外,最主要的原因是可以解决依赖冲突,防止你项目中出现 NoSuchMethodError, ClassNotFoundException 等不可控的异常。

项目改造

在 SpringCloud 项目体系中我们约定跟 SpringCloud 版本相关的用主 pom 文件进行版本控制,对于第三方组件或者公共模块的版本使用自定义的 bom 进行控制,接下来我们一步步对原有框架进行改造。

  • 建立 cloud-bom 模块
    此模块很简单,只有一个 pom 文件,定义项目模块中所需要依赖的第三方组件和公共模块,完整的 pom 文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<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.jianzh5.cloud</groupId>
    <artifactId>cloud-bom</artifactId>
    <packaging>pom</packaging>
    <version>1.0.0</version>

    <properties>
        <mybatis-plus.version>3.1.1</mybatis-plus.version>
        <mysql.version>5.1.47</mysql.version>
        <cloud-alibaba.version>1.0.0</cloud-alibaba.version>
    </properties>
    <!--管理所有第三方jar包版本,SpringCloud Alibaba 版本由主Pom控制-->
    <dependencyManagement>
        <dependencies>
            <!--cloud-common 版本-->
            <dependency>
                <groupId>com.jianzh5.cloud</groupId>
                <artifactId>cloud-common</artifactId>
                <version>${cloud-alibaba.version}</version>
            </dependency>
            <dependency>
                <groupId>com.jianzh5.cloud</groupId>
                <artifactId>account-feign</artifactId>
                <version>${cloud-alibaba.version}</version>
            </dependency>
            <dependency>
                <groupId>com.jianzh5.cloud</groupId>
                <artifactId>product-feign</artifactId>
                <version>${cloud-alibaba.version}</version>
            </dependency>

            <!--database-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>${mybatis-plus.version}</version>
            </dependency>
        </dependencies>

    </dependencyManagement>

    <repositories>
        <repository>
            <id>nexus-aliyun</id>
            <name>Nexus aliyun</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
        </repository>
    </repositories>
</project>

注意,这个模块不要再定义依赖了,否则在主 pom 文件中引入 bom 后项目启动会报循环依赖的异常(死循环),具体错误如下所示:

The build could not read 1 project -> [Help 1]
  
  The project com.jianzh5.cloud:cloud-aliaba:1.0.0 (D:\project_jianzh5\cloud-aliaba\pom.xml) has 1 error
    The dependencies of type=pom and with scope=import form a cycle: com.jianzh5.cloud:cloud-bom:1.0.0 -> com.jianzh5.cloud:cloud-bom:1.0.0 @ com.jianzh5.cloud:cloud-bom:1.0.0
To see the full stack trace of the errors, re-run Maven with the -e switch.
Re-run Maven using the -X switch to enable full debug logging.
For more information about the errors and possible solutions, please read the following articles:
  • 在主 pom 文件中引入 bom 模块的 pom
 <!--统一版本-->
<dependency>
	<groupId>com.jianzh5.cloud</groupId>
	<artifactId>cloud-bom</artifactId>
	<version>1.0.0</version>
	<type>pom</type>
	<scope>import</scope>
</dependency>

此段内容需要放在 dependencyManagement 中第一个位置

  • 去掉其他模块中引用组件的 <version> 定义,如:
<dependency>
	<groupId>com.jianzh5.cloud</groupId>
	<artifactId>cloud-common</artifactId>
</dependency>
  • 改造完成后整体结构如下
    image.png

  • 改造完成后对原项目进行测试,保证不影响原有功能
    建议在项目初期就引入 bom 进行管理,后期改造会相对麻烦。

至此我们已经完成了项目的统一版本管理,那么本期的“SpringCloud Alibaba 微服务实战四 - 版本管理”篇也就该结束啦,咱们下期有缘再见!

系列文章

image.png

  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    943 引用 • 1460 回帖 • 3 关注
  • 云计算
    78 引用 • 91 回帖 • 1 关注
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    142 引用 • 442 回帖 • 1 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • jchain

    为啥我的 不能引用成功 The dependencies of type=pom and with scope=import form a cycle。循环依赖吗?