原文转载:https://blog.csdn.net/privateobject/article/details/107856515#comments_13046129
1.参考资料
- maven的版本规范(七)
- maven 依赖规则&版本锁定
- Maven 依赖范围
- Maven详解之------maven版本管理
- maven依赖指定版本范围或者最新版本
- dependencyManagement使用简介
- maven指定版本号范围写法
- Maven profiles 多环境配置,测试环境与开发环境分开打包
2.版本定义
pom
中外部包引用实例,使用标签<version>
管理版本。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.jboss.marshalling</groupId>
<artifactId>jboss-marshalling-river</artifactId>
<version>2.0.9.Final</version>
<scope>provided</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>[3.1,)</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-tcnative</artifactId>
<version>2.0.30.Final</version>
<classifier>osx-x86_64</classifier>
<scope>compile</scope>
<optional>true</optional>
</dependency>
...
约定
<version>主版本.次版本.增量版本-里程碑版本</version>
- 1
说明:
- 主版本号:项目的重大架构变更
- 次版本号:较大范围的功能变化及bug修复
- 增量版本号:次要版本的增量更新,一般为bug修复
- 里程碑:某一版本的里程碑,一般为英文单词(内容参考百度百科)。无顺序说明:
- SNAPSHOT:快照版
- ALPHA:内部测试版,经历了α测试(开发环境下进行的测试)。软件测试的第一个版本
- BETA:外部测试版,经历了β测试(功能测试和系统测试)。软件测试的第二个版本
- RELEASE:发行版/稳定版
- RC:候选版,软件正式发布的候选版本
- SR:修正版/更新版
- FINAL:发布版/正式版,软件测试的第三个版本
- DEMO:演示版
- ENHANCED:增强版、加强版
- FREE:自由版
- FULL VERSION:完全版
- SHAREWARE / CARDWARE:共享版
- UPGRADE:升级版
- RETAIL:零售版
- PLUS:增强版
- PREVIEW:预览版
- STANDARD:标准版
- MINI:迷你版、精简版
- PREMIUM:超值版
- PROFESSIONAL:专业版
- EXPRESS:简易版
- DELUXE:豪华版
- REGGED:注册版
- TRIAL:试用版
- …
版本范围
标签<version>
管理,使用方式:
<version>1.18.8</version>
:常用写法,指定版本<version>(,1.0]</version>
:最低版本 不限制,最高版本 限制。version <= 1.0<version>[1.0]</version>
:最低版本 限制,最高版本 限制。version == 1.0<version>[1.0,1.9]</version>
:最低版本 限制,最高版本 限制。1.0 <= version <= 1.9<version>[1.0,2.0)</version>
:最低版本 限制,最高版本 限制。1.0 <= version < 2.0<version>[1.0,)</version>
:最低版本 限制,最高版本 不限制。1.0 <= version<version>(,1.0],[2.0,)</version>
:最低版本 限制,最高版本 限制。version <= 1.0 or version >= 2.0 排除1.0到2.0版本<version>(,1.1),(1.1,)</version>
:最低版本 限制,最高版本 限制。version < 1.1 or 1.1 < version 排除1.1版本
存在快照版本和非快照版本呢?默认情况下,同版本的快照版本会小于非快照版本。如:
<version>[1.0-SNAPSHOT,1.0]</version>
:如果1.0不存在则使用1.0-SNAPSHOT,1.0存在则使用1.0版本<version>[1.0,1.0-SNAPSHOT]</version>
:错误,会提示:Reason: Range defies version ordering
还有另外一种办法是使用maven的profile将各个环境的版本号区分开
多环境配置profile
将开发环境、测试环境、生产环境的配置文件分开存放,如下图:
在Maven中配置不同的环境打包配置文件的路径,配置如下:
<profiles>
<profile>
<!-- 开发环境 -->
<id>dev</id>
<properties>
<env>dev</env>
</properties>
<activation>
<!-- 默认激活该profile节点-->
<activeByDefault>true</activeByDefault>
</activation>
<build>
<resources>
<resource>
<directory>src/main/resources-env/dev</directory>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</profile>
<profile>
<!-- 测试环境 -->
<id>qa</id>
<properties>
<env>qa</env>
</properties>
<build>
<resources>
<resource>
<directory>src/main/resources-env/qa</directory>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</profile>
<profile>
<!-- 生产环境 -->
<id>online</id>
<properties>
<env>online</env>
</properties>
<build>
<resources>
<resource>
<directory>src/main/resources-env/online</directory>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</profile>
</profiles>
3.依赖范围
使用标签<scope>
管理,可选配置:compile
、test
、provided
、runtime
、system
、import
。
范围classpath | 编译 | 测试 | 运行 | 例子 |
---|---|---|---|---|
compile | Y | Y | Y | spring-core |
test | - | Y | - | junit |
provided | Y | Y | - | servlet-api |
runtime | - | Y | Y | jdbc 驱动 |
system | Y | Y | - | 本地的,maven之外的库 |
导入依赖的是可能存在传递依赖
maven调节原则:
- 谁先定义的用谁的传递依赖
- 直接依赖优先级大于传递依赖
编译依赖范围compile
该范围就是默认依赖范围,此依赖范围对于 编译、测试、运行 三种classpath
都有效
举个简单的例子,假如项目中有spring-core
的依赖,那么spring-core
不管是在 编译 ,测试 ,还是 运行 都会被用到,因此spring-core
必须是编译范围
构件默认的是编译范围,所以依赖范围是编译范围的无须显示指定
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>2.5</version>
<scope>compile</scope>
<!-- 默认为该依赖范围,无须显示指定 --〉
</dependency>
测试依赖范围test
顾名思义就是针对于 测试 的,使用此依赖范围的依赖,只对测试classpath
有效,在 编译 主代码和项目 运行 时,都将无法使用该依赖
最典型的例子就是 Junit
, 构件在 测试 时才需要,所以它的依赖范围是测试,因此它的依赖范围需要显示指定为<scope>test</scope>
不显示指定依赖范围也不会报错,但是该依赖会被加入到 编译 和 运行 的
classpath
中,造成不必要的浪费
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
已提供依赖范围provided
使用该依赖范围的maven
依赖,只对 编译 和 测试 的classpath
有效,对 运行 的classpath
无效
典型的例子就是servlet-api
, 编译 和 测试 该项目的时候需要该依赖,但是在 运行 时,web
容器已经提供的该依赖,所以运行时就不再需要此依赖
不显示指定该依赖范围,并且容器依赖的版本和
maven
依赖的版本不一致的话,可能会引起 版本冲突 ,造成不良影响
<dependency>
<groupId>javax-servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
运行时依赖范围runtime
使用该依赖范围的maven
依赖,只对 测试 和 运行 的classpath
有效,对 编译 的classpath
无效,
典型例子就是JDBC
的驱动实现,项目主代码 编译 的时候只需要JDK
提供的JDBC
接口,只有在 测试 和 运行的时候才需要实现上述接口的具体JDBC
驱动。
不显示指定依赖范围也不会报错,但是该依赖会被加入到 编译 的
classpath
中,造成不必要的浪费
系统依赖范围system
该依赖与classpath
的关系与 provided
依赖范围完全一致,但是系统依赖范围必须通过配置systemPath
元素来显示指定依赖文件的路径
此类依赖不是由
maven
仓库解析的,而且往往与本机系统绑定,可能造成构件的不可移植,因此谨慎使用
systemPath
元素可以引用环境变量
<dependency>
<groupId>javax.sql</groupId>
<artifactId>jdbc-stext</artifactId>
<version>2.0</version>
<scope>system</scope>
<systemPath>${java.home}/lib/rt.jar</systemPath>
</dependency>
导入依赖范围import
该依赖范围不会对三种classpath
产生影响,该依赖范围只能与dependencyManagement
元素配合使用
其功能为将目标pom
文件中dependencyManagement
的配置导入合并到当前pom
的dependencyManagement
中
有关
dependencyManagement
的功能请了解maven
继承特性。
4.排除依赖
使用标签<exclusions>
管理,将不需要的传递依赖的包去除掉:
5.版本锁定
使用标签<dependencyManagement>
管理,指定项目中依赖的版本。只是起到指定依赖版本的作用,并不会导入依赖。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-bean</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
Maven中的dependencyManagement元素提供了一种管理依赖版本号的方式。在dependencyManagement元素中声明所依赖的jar包的版本号等信息,那么所有子项目再次引入此依赖jar包时则无需显式的列出版本号。Maven会沿着父子层级向上寻找拥有dependencyManagement 元素的项目,然后使用它指定的版本号。
父项目pom.xml
配置:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.2.3.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
子项目pom.xml
配置,无需执行版本信息
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
6.提取常量(如版本号)
使用标签<properties>
管理,引入属性通过ognl
表达式带入到依赖的版本中:例如${spring.version}
。
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring.version>4.2.4.RELEASE</spring.version>
</properties>