maven的依赖传递(二)
2015-10-31 21:28
295 查看
一、jar包的作用域(包的依赖):scope
pom.xml:
1.test : 测试时会使用到该jar包,编译和打包时不会使用该jar包。
2.compile:编译范围有效,编译和打包时都会使用该jar包
3.provided:在编译和测试的过程使用该jar包,打包的时候不会用到该jar包
4.runtime在运行和测试的时候使用该jar包,编译的时候不使用该jar包
默认的是compile
二、jar包的传递(test作用域的jar包不会传递)
(1)当依赖级别相同的时候,先用哪个项目,就依赖对应的包
假设A项目有xx.1.0.jar
A_pom.xml:
B项目有xx.2.0.jar
B_pom.xml:
C项目依赖A,B。
C_pom.xml:
此时C中应该是哪个xx包??
解析:A与xx.1.0.jar是直接依赖,B与xx.2.0.jar也是直接依赖,C与xx.jar是间接依赖。
这种情况下,先声明了哪个依赖,就用哪个依赖对应的jar包。
所以此时在C项目里先定义依赖A,故C中使用的是xx.1.0.jar包。
(2)当依赖级别不同的时候,使用依赖级别较短的那个包
假设A项目有aa.2.0.jar,aa.2.0.jar里包含有bb.0.1.jar
A_pom.xml:
B项目有bb.2.1.jar
B_pom.xml:
C项目依赖A,B,
C_pom.xml:
此时C中依赖哪个bb的jar包?
这种情况下,用依赖级别较短的那个jar包。即A对bb包的依赖有2级,而B对bb包的依赖只有一级。
所以在C项目中,会使用B项目中的bb.2.1.jar
如果我们不想按照这种方式去传递包,而是想用某一个包,比如在上面的示例(2)中,我们想在C项目中使用A中的bb.0.1.jar。
此时可以exclusions标签来对B中的bb.2.1.jar包进行排除依赖:
C_pom.xml:
经过上面的配置以后,C项目中使用的就是A中的bb.0.1.jar拉。
附加一些说明:
(1)mvn:compile 执行该命令等于把src中的代码进行编译,产生taget文件夹,编译到class
(2)mvn:test 执行该命令就把测试代码进行编译
(3)mvn:clean :清空target
(4)mvn:install:把项目打包到本地仓库
(5)mvn:package:把项目进行打包
关于groupId 、 artifactId 和 version
groupId:一般是公司网站逆序字符串,比如com.xxx、org.apache
artifactId:指某一个模块,比如core、service等
version:版本号,比如:0.0.1-SNAPSHOT
版本号的定义为:x.x.x-里程碑,第一个x表示大版本(大调整,架构上的变化),第二个x表示分支(大版本下的分支),第三个x表示分支里做了多少次更新;
里程碑有SNAPSHOT(正在开发中的版本),alpha(开发完后,内部的测试版本),beta(项目测试完没问题后定义该版本,可供使用人员下载下来用),
用了一段时间后没问题了就定义为Release(RC)版本,最后会生成一个可靠版本GA。
pom.xml:
<dependency> <groupId>org.zzz</groupId> <artifactId>xx</artifactId> <version>1.0</version> <scope></scope> </dependency>
1.test : 测试时会使用到该jar包,编译和打包时不会使用该jar包。
2.compile:编译范围有效,编译和打包时都会使用该jar包
3.provided:在编译和测试的过程使用该jar包,打包的时候不会用到该jar包
4.runtime在运行和测试的时候使用该jar包,编译的时候不使用该jar包
默认的是compile
二、jar包的传递(test作用域的jar包不会传递)
(1)当依赖级别相同的时候,先用哪个项目,就依赖对应的包
假设A项目有xx.1.0.jar
A_pom.xml:
<dependency> <groupId>org.zzz</groupId> <artifactId>xx</artifactId> <version>1.0</version> </dependency>
B项目有xx.2.0.jar
B_pom.xml:
<dependency> <groupId>org.zzz</groupId> <artifactId>xx</artifactId> <version>2.0</version> </dependency>
C项目依赖A,B。
C_pom.xml:
<dependency> <groupId>com.carlo</groupId> <artifactId>A</artifactId> <version>0.0.1</version> </dependency> <dependency> <groupId>com.carlo</groupId> <artifactId>B</artifactId> <version>0.0.1</version> </dependency>
此时C中应该是哪个xx包??
解析:A与xx.1.0.jar是直接依赖,B与xx.2.0.jar也是直接依赖,C与xx.jar是间接依赖。
这种情况下,先声明了哪个依赖,就用哪个依赖对应的jar包。
所以此时在C项目里先定义依赖A,故C中使用的是xx.1.0.jar包。
(2)当依赖级别不同的时候,使用依赖级别较短的那个包
假设A项目有aa.2.0.jar,aa.2.0.jar里包含有bb.0.1.jar
A_pom.xml:
<dependency> <groupId>org.zzz</groupId> <artifactId>aa</artifactId> <version>2.0</version> </dependency>
B项目有bb.2.1.jar
B_pom.xml:
<dependency> <groupId>org.zzz</groupId> <artifactId>bb</artifactId> <version>2.1</version> </dependency>
C项目依赖A,B,
C_pom.xml:
</pre><pre name="code" class="html"><dependency> <groupId>com.carlo</groupId> <artifactId>A</artifactId> <version>0.0.1</version> </dependency> <dependency> <groupId>com.carlo</groupId> <artifactId>B</artifactId> <version>0.0.1</version> </dependency>
此时C中依赖哪个bb的jar包?
这种情况下,用依赖级别较短的那个jar包。即A对bb包的依赖有2级,而B对bb包的依赖只有一级。
所以在C项目中,会使用B项目中的bb.2.1.jar
如果我们不想按照这种方式去传递包,而是想用某一个包,比如在上面的示例(2)中,我们想在C项目中使用A中的bb.0.1.jar。
此时可以exclusions标签来对B中的bb.2.1.jar包进行排除依赖:
C_pom.xml:
<dependency> <groupId>com.carlo</groupId> <artifactId>A</artifactId> <version>0.0.1</version> </dependency> <dependency> <groupId>com.carlo</groupId> <artifactId>B</artifactId> <version>0.0.1</version> <!--排除依赖,不需要写version,因为每个项目都只依赖某一版本的某一个包,所以在配置排除依赖的时候,不需要加上版本号了--> <exclusions> <exclusion> <groupId>org.zzz</groupId> <artifactId>bb</artifactId> </exclusion> </exclusions> </dependency>
经过上面的配置以后,C项目中使用的就是A中的bb.0.1.jar拉。
附加一些说明:
(1)mvn:compile 执行该命令等于把src中的代码进行编译,产生taget文件夹,编译到class
(2)mvn:test 执行该命令就把测试代码进行编译
(3)mvn:clean :清空target
(4)mvn:install:把项目打包到本地仓库
(5)mvn:package:把项目进行打包
关于groupId 、 artifactId 和 version
groupId:一般是公司网站逆序字符串,比如com.xxx、org.apache
artifactId:指某一个模块,比如core、service等
version:版本号,比如:0.0.1-SNAPSHOT
版本号的定义为:x.x.x-里程碑,第一个x表示大版本(大调整,架构上的变化),第二个x表示分支(大版本下的分支),第三个x表示分支里做了多少次更新;
里程碑有SNAPSHOT(正在开发中的版本),alpha(开发完后,内部的测试版本),beta(项目测试完没问题后定义该版本,可供使用人员下载下来用),
用了一段时间后没问题了就定义为Release(RC)版本,最后会生成一个可靠版本GA。
相关文章推荐
- 十一月英语总结
- jsp获取contextPath的方法
- Struts前后台传值
- jpa的初步入门
- Angry Bots源码分析
- Hibernate中继承关系映射二
- [LeetCode]题解(python):037-Sudoku Solver
- HDU 5521 [ACM 2015 沈阳] Meeting [最短路]
- Python Excel解析
- Unix环境高级编程学习笔记之进程环境(1)
- 常用的正则表达式
- 20151031的NOIP模拟赛
- C-指针
- 支持Python3的图表库
- [hdu5521 Meeting]最短路
- Ubuntu 14.04 安装 Python3
- 项目冲刺链接汇总
- 导航布局和视频弹出框制作
- Python验证码识别处理实例
- c语言之动态栈的功能实现