`
liyixing1
  • 浏览: 940408 次
  • 性别: Icon_minigender_1
  • 来自: 江西上饶
社区版块
存档分类
最新评论

项目依赖

阅读更多
依赖具有范围,默认为全局范围

也可以指定依赖范围
Maven有以下几种依赖范围:

compile:编译依赖范围(默认),使用此依赖范围对于编译、测试、运行三种 classpath 都有效,即在编译、测试和运行的时候都要使用该依赖jar包;

test:测试依赖范围,从字面意思就可以知道此依赖范围只能用于测试classpath,而在编译和运行项目时无法使用此类依赖,典型的是JUnit,它只用于编译测试代码和运行测试代码的时候才需要;

provided:此依赖范围,对于编译和测试classpath有效,而对运行时无效;例如对于servlet的依赖,只有在测试和编译时有效,之后就无效了

runtime:运行时依赖范围,对于测试和运行classpath有效,但是在编译主代码时无效,典型的就是JDBC驱动实现;

system:系统依赖范围,使用system范围的依赖时必须通过systemPath元素显示地指定依赖文件的路径,不依赖Maven仓库解析,所以可能会造成建构的不可移植,谨慎使用。

依赖传递性
简单点理解,可以看成A依赖B,B依赖C,那么A也依赖C


Maven建立一个依赖图,并且处理一些可能发生的冲突和重叠。例如,如果Maven看到有两个项目依赖于同样的groupId和artifactId,它会自动整理出使用哪个依赖,选择那个最新版本的依赖。虽然这听起来很方便,但在一些边界情况中,传递性依赖会造成一些配置问题。在这种情况下,你可以使用依赖排除。

另外,如果依赖指定了范围,那么在进行传递性依赖的时候,会做一些算法,包括如下

compile范围的依赖,会一直传递给其他范围
provided范围的依赖,只会传递给provided范围的
runtime范围的依赖,会传递给runtime和provided范围和test范围
test范围只会传递给test

排除传递依赖
<dependency>
<groupId>org.sonatype.mavenbook</groupId>
<artifactId>project-a</artifactId>
<version>1.0</version>
<exclusions>
<exclusion>
<groupId>org.sonatype.mavenbook</groupId>
<artifactId>project-b</artifactId>
</exclusion>
</exclusions>
</dependency>

通过exclusions和exclusion
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.2.5.ga</version>
<exclusions>
<exclusion>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-jta_1.1_spec</artifactId>
<version>1.1</version>
</dependency>
</dependencies>


当版本冲突时maven默认选择最新的。
但是当artifactId和artifactId不一样的时候,Maven就会认为它们是两种不同的类
库。
dependencyManagement
dependencyManagement可以作为父pom对只项目的依赖管理的统一控制


依赖版本界限
可以指定范围
(, )
不包含量词
[, ]
包含量词

如[4.0,)
,“[4.0,)”意思是任何大于等于4.0的版本,“(,2.0)”意思是任意小于2.0的版
本。“[1.2]”意思是只有版本1.2,没有其它。

方括号和圆括号可以混合用。
方括号可以看成 >= 和<=
圆括号可以看成 >和<
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics