springboot中父子项目之版本依赖管理

springboot的版本依赖管理,是我们日常开发中的核心之一。做好版本管理,我们后续的开发就能够事半功倍。

本文主要讲解maven的版本依赖管理相关的知识。

一、版本依赖的基本概念

Maven依赖管理的基本概念

依赖管理包含依赖声明、依赖范围、依赖传递三个部分。

  1. 依赖声明
    maven中,我们通常用<dependency>标签来表示依赖声明的开始。
    该标签包含三个元素:
    1.1)groupId:依赖的组织或公司标识,通常是反向域名
    1.2)artifactId‌:依赖的名称,即库的标识符
    1.3)version‌:依赖的版本号
  2. 依赖范围
    常见的依赖范围包括:
    2.1)compile‌(默认作用域):在项目的所有生命周期阶段都可用,包括编译、测试、打包、安装和部署。
    2.2)‌provided‌:在编译和测试时可用,但在运行时由容器提供。
    2.3)runtime‌:在运行时需要,但在编译时不可用。
    2.4)test‌:仅在测试阶段使用。
    2.5)system‌:来自系统路径,需要手动指定文件路径。
    2.6)import‌:仅适用于pom类型的依赖,用于引入 BOM ( 构建材料清单 ),用于集中管理多个依赖的版本‌12。
  3. 依赖传递‌
    Maven会自动解析依赖的依赖关系,即传递性依赖。如果项目A依赖于库B,库B又依赖于库C,Maven会自动下载并引入库C‌。

 通过版本依赖管理,我们可以更好地统一管理引入的资源版本的一致性,提高我们的开发效率,有效避免资源版本之前的冲突。

二、示例

2.1 项目层级

 

hs:父项目

hs-dependencies:管理项目内的所有版本依赖(看名字应该也能一目了然)

hs-framework:包含各类技术框架

hs-common:hs-framework的子项目

hs-spring-boot-starter-web:hs-framework的子项目

2.2 各模块的pom文件配置

1) 父项目的xml
<?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.hs</groupId>
    <artifactId>hs</artifactId>
    <version>${revision}</version>
    <packaging>pom</packaging><!-- 打包类型:pom,表示这个产生任何执行类代码,只是单纯用作项目管理 -->

    <name>${project.artifactId}</name>
    <modules>
        <module>hs-framework</module>
        <module>hs-dependencies</module>
    </modules>

    <properties>
        <revision>1.0-jdk8-SNAPSHOT</revision>
        <java.version>1.8</java.version>
        <maven.compiler.source>${java.version}</maven.compiler.source>
        <maven.compiler.target>${java.version}</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.hs</groupId>
                <artifactId>hs-dependencies</artifactId>
                <version>${revision}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    
</project>
2) hs-dependencies
<?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.hs</groupId>
    <artifactId>hs-dependencies</artifactId>
    <version>${revision}</version>
    <packaging>pom</packaging>


    <properties>
        <revision>1.0-jdk8-SNAPSHOT</revision>
        <java.version>1.8</java.version>
        <maven.compiler.source>${java.version}</maven.compiler.source>
        <maven.compiler.target>${java.version}</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!-- 统一依赖管理 -->
        <spring.framework.version>5.3.39</spring.framework.version>
        <spring.security.version>5.8.14</spring.security.version>
        <spring.boot.version>2.7.18</spring.boot.version>
    </properties>


    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-framework-bom</artifactId> <!-- JDK8 版本独有:保证 Spring Framework 尽量高 -->
                <version>${spring.framework.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-bom</artifactId> <!-- JDK8 版本独有:保证 Spring Security 尽量高 -->
                <version>${spring.security.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring.boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>


            <!-- Web 相关 -->
            <dependency>
                <groupId>com.hs</groupId>
                <artifactId>hs-spring-boot-starter-web</artifactId>
                <version>${revision}</version>
            </dependency>

        </dependencies>
    </dependencyManagement>



</project>
3) hs-framework
<?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>
    <parent>
        <groupId>com.hs</groupId>
        <artifactId>hs</artifactId>
        <version>${revision}</version>
    </parent>
    <packaging>pom</packaging>
    <modules>
        <module>hs-common</module>
        <module>hs-spring-boot-starter-web</module>
    </modules>

    <artifactId>hs-framework</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>


    <description>
        该包是技术组件,每个子包,代表一个组件。每个组件包括两部分:
        1. core 包:是该组件的核心封装
        2. config 包:是该组件基于 Spring 的配置

        技术组件,也分成两类:
        1. 框架组件:和我们熟悉的 MyBatis、Redis 等等的拓展
        2. 业务组件:和业务相关的组件的封装,例如说数据字典、操作日志等等。
        如果是业务组件,Maven 名字会包含 biz
    </description>

</project>
 4) hs-common
<?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">
    <parent>
        <groupId>com.hs</groupId>
        <artifactId>hs-framework</artifactId>
        <version>${revision}</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>hs-common</artifactId>
    <packaging>jar</packaging>

    <name>${project.artifactId}</name>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

</project>
5) hs-spring-boot-starter-web
<?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">

    <parent>
        <groupId>com.hs</groupId>
        <artifactId>hs-framework</artifactId>
        <version>${revision}</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>
    <artifactId>hs-spring-boot-starter-web</artifactId>
    <packaging>jar</packaging>

    <name>${project.artifactId}</name>
    <description>Web 框架,全局异常、API 日志、脱敏、错误码等</description>


    <dependencies>
        <!-- Web 相关 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

</project>

2.3 问题

我们说的版本依赖管理,是基于父子项目之间的。那你是否有疑问:hs-spring-boot-starter-web 怎么做到可以不定义version属性,父项目又是怎样实现版本管理的?

 请各位同学自行思考几分钟,再往下看!!!

 

说到这个,就得讲一讲maven版本依赖中,对version的控制。

通常,我们定义依赖的写法都是这种,以springweb为例

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.3.1.RELEASE</version>
    </dependency>
</dependencies>

父子项目管理中,我们采用版本管理的方式后,子项目的依赖导入通常这么写

    <dependencies>
        <!-- Web 相关 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

两者对比之下,我们发现第二种写法比第一种写法少了一个version标签

maven中,首先会读取引入的依赖是否会有version属性,如若没有,若项目是父子项目,maven会往上查找父项目中,是否存在<dependencyManagement>,若有则查找相关的依赖版本,若无,则报错

在上面的示例中,我们的父项目是如此导入依赖的:

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.hs</groupId>
                <artifactId>hs-dependencies</artifactId>
                <version>${revision}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

hs-dependencies是我们统一的依赖管理,在父项目import进来之后,就能实现对子项目的版本管理。

至此,本文关于父项目如何实现对子项目的相关讲解结束!

本文对Maven版本依赖管理的其他讲解没有很细致,如有同学需了解其他方面内容,可联系博主,稍做完善!

我是写代码的小和尚,平时喜欢写写博客,如果我的文章对您有所帮助,麻烦点赞收藏一下吧!让更多的人看见,谢谢大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值