0.> 依赖的作用域:
scope=test: 测试时会使用,编译和打包时不会使用;
scope=compile: 编译和打包时都会使用==》默认;
scope=provided:编译和测试时会使用,打包时不会使用,如servlet-api.jar包, 因为在tomcat等中间件中已经存在该包,如果打包时打入该包,则包在服务器运行时会出错;
scope=runtime:运行和测试时依赖,比如说连接mysql或oracle数据库的jar包;
scope=system:与provided类似,但须显式的提供一个本地系统的JAR文件路径。Maven不会在仓库中去寻找这些jar包(不推荐使用,建议尽量去Maven仓库中引用依赖)。
示例如下:
<project>
<dependencies>
<dependency>
<groupId>sun.jdk</groupId>
<artifactId>tools</artifactId>
<version>1.5.0</version>
<scope>system</scope>
<systemPath>${java.home}/../lib/tools.jar</systemPath>
</dependency>
...
</dependencies>
</project>
scope=import:仅支持在<dependencyManagement>中的类型依赖项上。它表示要在指定的<dependencyManagement>部分中用有效的依赖关系列表替换的依赖关系。通过非继承的方式来引入这段依赖管理配置。该scope类型的依赖项不会参与限制依赖项的可传递性。
1.> 包依赖会传递,但scope=test不会传递;
2.> 包依赖时的规则:
2.1> 当两个包的引用级别一样时,比如说C依赖D1.0,B依赖D1.1,A依赖B且A依赖C, 此时,在A中dependency先定义A依赖B,则引用D1.1,否则引用D1.0;
2.2> 当两个包的引用级别不一样时, 则引用级别短的那个包, 如 C依赖D1.0,B依赖D1.1,A依赖B且A依赖D1.2, 则引用D1.2;
2.3> <optional>true</optional>,依赖不传递:projectA 依赖projectB, projectB 依赖projectC,当projectB的<optional>true</optional>时, projectA中如果没有显式的引入projectC, 则projectA不依赖projectC, 即projectA可以自己选择是否依赖projectC。默认<optional>的值为false。
3.> 使用Maven管理jar时,如果出现依赖,可以使用 exclusions 来排除依赖: