学习资料:
http://www.iteye.com/topic/240424
https://blog.csdn.net/kimylrong/article/details/50353161
一、dependency的配置
1. 各配置项的含义
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.2.6.ga</version>
<scope>provided</scope>
</dependency>
a. groupId、artifactId、version:决定了本地jar包的目录,默认jar包下载后存放在%repository%\org\hibernate\hibernate\3.2.6.ga\hibernate-3.2.6.ga.jar。
- 其中,repository目录默认为: /Users/你的用户名/.m2/;如果修改过maven的setting.xml配置,则为你指定的目录
- 存放目录是groupid + artifactid + version,且以点号作分隔建立文件夹的
|–org
|–hibernate
|–hibernate
|–3.2.6.ga
|–hibernate-3.2.6.ga.jar
b. scope:限制dependency的作用范围的, 影响maven项目在各个生命周期时导入的package的状态。共6种值 ,默认为compile。且dependencies会传递到依赖的项目中
- compile:默认值compile。compile表示被依赖项目需要参与当前项目的编译,后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去。
- test:依赖项目仅仅参与测试相关的工作,包括测试代码的编译,执行。比较典型的如junit。不作用在运行时。
- runntime:被依赖项目无需参与项目的编译,但后期的测试和运行周期需要其参与。与compile相比,跳过了编译。
- provided:打包的时候可以不用包进去,别的设施(Web Container)会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是在打包阶段做了exclude的动作。没有传递性,
- system:从参与度来说,也provided相同,不过被依赖项不会从maven仓库抓,而是从本地文件系统拿,一定需要配合systemPath属性使用
2. scope的传递
A–>B–>C。当前项目为A,A依赖于B,B依赖于C。知道B在A项目中的scope,那么C在A中的scope是:
- 当C是test或者provided时,C直接被丢弃,A不依赖C;
- 否则A依赖C,C的scope继承于B的scope。