maven的jar库版本说明-----pom<version>

原文转载:https://blog.csdn.net/privateobject/article/details/107856515#comments_13046129

 

1.参考资料

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

说明:

  1. 主版本号:项目的重大架构变更
  2. 次版本号:较大范围的功能变化及bug修复
  3. 增量版本号:次要版本的增量更新,一般为bug修复
  4. 里程碑:某一版本的里程碑,一般为英文单词(内容参考百度百科)。无顺序说明:
    1. SNAPSHOT:快照版
    2. ALPHA:内部测试版,经历了α测试(开发环境下进行的测试)。软件测试的第一个版本
    3. BETA:外部测试版,经历了β测试(功能测试和系统测试)。软件测试的第二个版本
    4. RELEASE:发行版/稳定版
    5. RC:候选版,软件正式发布的候选版本
    6. SR:修正版/更新版
    7. FINAL:发布版/正式版,软件测试的第三个版本
    8. DEMO:演示版
    9. ENHANCED:增强版、加强版
    10. FREE:自由版
    11. FULL VERSION:完全版
    12. SHAREWARE / CARDWARE:共享版
    13. UPGRADE:升级版
    14. RETAIL:零售版
    15. PLUS:增强版
    16. PREVIEW:预览版
    17. STANDARD:标准版
    18. MINI:迷你版、精简版
    19. PREMIUM:超值版
    20. PROFESSIONAL:专业版
    21. EXPRESS:简易版
    22. DELUXE:豪华版
    23. REGGED:注册版
    24. TRIAL:试用版

版本范围

标签<version>管理,使用方式:

  1. <version>1.18.8</version>:常用写法,指定版本
  2. <version>(,1.0]</version>:最低版本 不限制,最高版本 限制。version <= 1.0
  3. <version>[1.0]</version>:最低版本 限制,最高版本 限制。version == 1.0
  4. <version>[1.0,1.9]</version>:最低版本 限制,最高版本 限制。1.0 <= version <= 1.9
  5. <version>[1.0,2.0)</version>:最低版本 限制,最高版本 限制。1.0 <= version < 2.0
  6. <version>[1.0,)</version>:最低版本 限制,最高版本 不限制。1.0 <= version
  7. <version>(,1.0],[2.0,)</version>:最低版本 限制,最高版本 限制。version <= 1.0 or version >= 2.0 排除1.0到2.0版本
  8. <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>管理,可选配置:compiletestprovidedruntimesystemimport

范围classpath编译测试运行例子
compileYYYspring-core
test-Y-junit
providedYY-servlet-api
runtime-YYjdbc驱动
systemYY-本地的,maven之外的库

导入依赖的是可能存在传递依赖
maven调节原则:

  1. 谁先定义的用谁的传递依赖
  2. 直接依赖优先级大于传递依赖

编译依赖范围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的配置导入合并到当前pomdependencyManagement

有关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>
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值