springboot的版本依赖管理,是我们日常开发中的核心之一。做好版本管理,我们后续的开发就能够事半功倍。
本文主要讲解maven的版本依赖管理相关的知识。
一、版本依赖的基本概念
Maven依赖管理的基本概念
依赖管理包含依赖声明、依赖范围、依赖传递三个部分。
- 依赖声明
maven中,我们通常用<dependency>标签来表示依赖声明的开始。
该标签包含三个元素:
1.1)groupId:依赖的组织或公司标识,通常是反向域名
1.2)artifactId:依赖的名称,即库的标识符
1.3)version:依赖的版本号- 依赖范围
常见的依赖范围包括:
2.1)compile(默认作用域):在项目的所有生命周期阶段都可用,包括编译、测试、打包、安装和部署。
2.2)provided:在编译和测试时可用,但在运行时由容器提供。
2.3)runtime:在运行时需要,但在编译时不可用。
2.4)test:仅在测试阶段使用。
2.5)system:来自系统路径,需要手动指定文件路径。
2.6)import:仅适用于pom类型的依赖,用于引入 BOM ( 构建材料清单 ),用于集中管理多个依赖的版本12。- 依赖传递
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版本依赖管理的其他讲解没有很细致,如有同学需了解其他方面内容,可联系博主,稍做完善!
我是写代码的小和尚,平时喜欢写写博客,如果我的文章对您有所帮助,麻烦点赞收藏一下吧!让更多的人看见,谢谢大家!




913

被折叠的 条评论
为什么被折叠?



