二. 依赖管理
1. 添加依赖
在 pom.xml
中的 dependencies
下添加 dependency
, 指定想要的依赖包的坐标, maven 就会为项目添加该依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<!-- type 默认为 jar, 可省略 -->
<type>jar</type>
</dependency>
</dependencies>
添加完依赖后, 需要让 maven 加载新的依赖, eclipse-update, idea-reimport
mvn dependency: resolve
1.1. 传递性依赖
在实际项目中, 我们项目依赖的构件, 可以也依赖于其他的一些构件. maven 支持传递性依赖, 我们只需要在 pom.xml 中添加我们直接依赖的库, maven 获取到这些构件后 (同时也会获取该构件的pom, 根据这个pom获取它的依赖), 会进一步地获取被这些构件依赖的构件并加入我们的项目中.
如果想要了解项目的依赖树, 可以通过命令获取:
mvn dependency: tree
如果有多个不同构件, 依赖了同一个构件的不同版本, maven 会根据 就近原则, 获取依赖层次最低的那个版本. 如果需要使用其他版本, 则可以在我们自己的 pom.xml
中指定需要使用的版本 (改变了该构件在依赖树中的层次).
如果想了解完整的依赖踪迹, 包含那些因为依赖冲突或其他原因被拒绝引入的构件, 可以打开 maven 的调试标记 -X
执行
mvn install -X
1.2. 可选依赖
如果有这么一个接口项目, 声明了一套 API 接口, 并可以选择使用多个不同的实现.
用户在使用时, 可能只是需要其中一个, 而不希望同时引入两套实现, 这种时候可以使用可选依赖.
<optional> true </optional>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
<!-- 声明这是个可选依赖 -->
<optional>true</optional>
</dependency>
</dependencies>
当在一个项目中将依赖声明为可选依赖后, maven 在组织传递性依赖的时候将不会引入该依赖, 而必须在主项目的 pom 中显式引入要使用的可选依赖.
还有另外一种方式是创建一系列的多个子项目, 每个子项目引用一个特定的实现, 而不是在一个项目中声明可选依赖. 这样最终用户只需要选择合适的子项目, 而不需要在引用项目的同时声明该项目需要的可选依赖.
1.3. 检查直接依赖
可能会存在一种情况, 项目代码中引用了一个传递性依赖, 但并没有在项目 pom 中显式的声明引入. 这会存在一种风险, 如果带来这个传递性依赖升级后去掉了这个传递性依赖, 那么这个传递性依赖将从项目的依赖树中移除, 这个时候, 由于缺少依赖, 项目将构建失败.
为了避免这种情况, 建议总是声明对直接依赖的引用.
使用 maven 的 dependency 插件对项目进行分析, 可以找到未声明的依赖
mvn dependency: analyze
2. 依赖版本管理
2.1. 版本属性变量
实际项目中, 可能会有多个相关的构件, 使用相同的版本号, 若我们为每个构件单独指定版本号, 麻烦而且不便修改. 借助 pom 属性引用, 可以先声明一个属性变量, 然后依赖版本中引用这个属性. 这样可以实现插件版本的统一管理, 而且需要替换版本时也更加方便.
<!-- 声明属性 -->
<properties>
<spring.version>4.3.3.RELEASE</spring.version>
</properties>
<!-- 多个依赖引用同一个属性 -->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
2.2. 多模块依赖管理
对于多模块项目, 可以统一在父项目中使用 dependencyManagement
元素声明依赖版本, 而子模块只需要指定依赖的 Gid 和 Aid, 不需关心版本的问题.
dependencyManagement
元素只负责声明依赖, 但并未真正引用依赖, 子模块在需要引用依赖时, 需要在dependencies
元素中指定 Gid 和 Aid
-
在父项目 pom 中使用
dependencyManagement
元素声明<dependencyManagement> <dependen