坐标:
为了标识 Java 构件世界中的某个构件
groupId:项目,一般是公司或组织
artifactId:模块,推荐使用项目名作为前缀,如 spring-core,spring-bean 等
version:版本
packaging:打包方式,默认为 jar
classifier:帮助定义构建输出的一些附属构件。一般很少用到这个
举例:
1 <dependencies> 2 <dependency> 3 <groupId>junit</groupId> 4 <artifactId>junit</artifactId> 5 <version>4.12</version> 6 <scope>test</scope> 7 </dependency> 8 </dependencies>
依赖的配置
以上几个元素,可以标识一个构件在 Java 世界中的位置,那么具体如何被依赖使用呢?
type:对应于 packaging,一般为 jar
scope:依赖的范围
optional:依赖是否可选
exclusions:排除传递性依赖
依赖范围
依赖范围用来控制依赖与三种 classpath 的关系:编译 classpath、测试 classpath、运行 classpath
compile:编译依赖范围,默认依赖范围。对于编译、测试、运行三种 classpath 都有效。如:spring-core
test:测试依赖范围。只在测试 classpath 有效。如:junit
provided:已提供依赖范围,编译和测试有效,运行时无效。如:servlet-api。运行的时候由容器提供
runtime:运行时依赖范围,测试和运行时有效,编译时无效。如:JDBC 驱动的实现
system:系统依赖范围
import:导入依赖范围
依赖的传递性
项目依赖 A,A 依赖 B。那么在使用 Maven 引入 A 的时候,A 会自动将其依赖的 B 也引入
依赖调节
同一个构件可能被多个依赖所依赖,这个时候使用哪个构件?
第一原则:路径短的优先
第二原则:先声明的优先
可选依赖
项目 A 依赖于 B,那么在构件的世界里,如果一个项目引入了 A,那么同时也会引入 B,如果不想 B 被引入怎么办?就需要将 B 设置为一个可选的依赖
就是添加了一个 optional 属性
排除依赖
项目 A 依赖项目 B,如果我们要引入 A 而又不想通过依赖传递引入 B,那么可以使用排除依赖
1 <dependency> 2 <groupId>junit</groupId> 3 <artifactId>junit</artifactId> 4 <version>${junit.version}</version> 5 <scope>test</scope> 6 <exclusions> 7 <exclusion> 8 <groupId></groupId> 9 <artifactId></artifactId> 10 </exclusion> 11 </exclusions> 12 </dependency>