1、Maven中scope - 依赖范围:
<project>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
| 依赖范围/scope | 编译classpath | 测试classpath | 运行classpath | 例子 |
|---|---|---|---|---|
| compile(未声明默认值) | Y | Y | Y | spring-core |
| test | - | Y | - | Junit |
| provided | Y | Y | - | servlet-api |
| runtime | - | Y | Y | JDBC驱动实现 |
| system | Y | Y | - | 本地、Maven仓库之外的类库 |
2、依赖调解 - Dependency Mediation
第一原则:路径最近者优先;
第二原则:第一声明者优先;
3、可选依赖 - <optional>true</optional>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.1-901-1.jdbc4</version>
<optional>true</optional>
</dependency>
只会对当前项目产生影响,当其他项目依赖于该项目时,这两个依赖不会被传递;如果其他项目依赖于该项目,实际使用MySQL数据库,就需要显式地声明mysql-connector-java这个依赖;
基于面向对象设计中的单一职责性原则,在规划Maven项目时也适用;
更好的做法:为两种不同数据库分别创建一个maven项目,基于同样的groupId分配不同的artifactId,在各自pom文件中声明对应的JDBC驱动依赖,而且不使用可选依赖,用户根据实际需求选择使用哪一个项目;由于传递性依赖的作用,就不需要再显式地声明JDBC的驱动了;
4、排除依赖
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<exclusions>
<exclusion>
<groupId></groupId>
<artifactId></artifactId>
</exclusion>
</exclusions>
</dependency>
exclusions可以包含一个或多个exclusion子元素;
声明exclusion只需要groupId和artifactId,而不需要version元素;
5、归类依赖
1万+

被折叠的 条评论
为什么被折叠?



