1. Maven一个核心的特性就是依赖管理。当我们处理多模块的项目(包含成百上千个模块或者子项目), 模块间的依赖关系就变得非常复杂, 管理也变得很困难。针对此种情形, Maven提供了一种高度控制的方法。
2. 可传递性依赖
2.1. 一种相当常见的情况, 比如说: A依赖于其他库B; 另外一个项目C想要使用A, 那么C项目也可以使用库B。
2.2. Maven可以避免去搜索所有所需库的需求。Maven通过读取项目文件(pom.xml), 找出它们项目之间的依赖关系。
2.3. 我们需要做的只是在每个项目的pom中定义好直接的依赖关系。其他的事情Maven会帮我们搞定。
2.4. 通过可传递性的依赖, 所有被包含的库的图形会快速的增长。当有重复库时, 可能出现的情形将会持续上升。Maven提供一些功能来控制可传递的依赖的程度。
3. 依赖调节
3.1. 决定当多个手动创建的版本同时出现时, 哪个依赖版本将会被使用。
3.2. 我们先导入spring-context-4.2.4.RELEASE.jar这个jar包, 然后再导入spring-webmvc-4.2.5.RELEASE.jar这个jar包, 这两个jar包之间存在多个相同jar包的相互依赖关系, 实际生效的spring-webmvc和spring-web是4.2.5的, spring-aop、spring-beans、spring-context、spring-core和spring-expression是4.2.4的。
3.3. 那么我们先导入spring-webmvc-4.2.5.RELEASE.jar这个jar包, 然后再导入spring-context-4.2.4.RELEASE.jar这个jar包, spring-beans、spring-core和spring-expression变成了是4.2.5的。我们注意看spring-beans、spring-core和spring-expression这三个包在spring-webmvc-4.2.5.RELEASE.jar和spring-context-4.2.4.RELEASE.jar中的最高层次都是2。如果两个依赖版本在依赖树里的深度是一样的时候, 第一个被声明的依赖将会被使用。
3.4. 首先导入spring-webmvc-4.2.5.RELEASE.jar这个jar包, 然后再导入spring-context-4.2.4.RELEASE.jar这个jar包, 最终生效的spring-context是4.2.4的。spring-context在spring-webmvc-4.2.5.RELEASE.jar中的最高层次是2, 在spring-context-4.2.4.RELEASE.jar中的最高层次是1。依赖层次优先原则, 使用层次最高的。
4. 依赖排除
4.1. 任何可传递的依赖都可以通过 "exclusion" 元素被排除在外。
4.2. 我们想使用Slf4j和logback日志的日志模式, 就不需要commons-logging日志包, 可以剔除它。
4.3. 右键commons-logging-1.2.jar——>Exclude Maven Artifact...
4.4. 点击Ok按钮
4.5. 在pom.xml的spring-context-4.2.4.RELEASE.jar的依赖坐标中多出了exclusions节点, 该节点剔除了commons-logging包。我们添加上Slf4j和logback相关日志包。
4.6. 实际生效的没有commons-logging-1.2.jar包了。
5. 依赖可选
5.1. 任何可传递的依赖可以被标记为可选的, 通过使用"optional"元素。例如: Shop_Web依赖Shop_Service, Shop_Service依赖Shop_Dao。因此, Shop_Service可以标记Shop_Dao为可选的, 这样Shop_Web就可以不再使用Shop_Dao。
5.2. Shop_Service依赖Shop_Dao。
5.3. Shop_Web依赖Shop_Service。
5.4. Shop_Web同时依赖了Shop_Dao和Shop_Service。
5.5. 在Shop_Service中, 依赖Shop_Dao时, 标记为可选的。
5.6. 这样Shop_Web就可以不再使用Shop_Dao
6. 定义版本常量
6.1. 可以使用properties标签定义版本遍历, 一次定义多次使用, 版本变迁的时候只用修改版本变量, 达到对版本的管理。
7. 版本锁定
7.1. 可以定义dependencyManagement标签对jar的版本进行锁定, 这样子工程再添加相同的jar的依赖的时候只能使用此版本。
8. 依赖范围
8.1. 传递依赖发现可以通过使用如下的依赖范围来得到限制:
8.2. Tomcat(网络服务器)也包含有jsp-api-2.0.jar, 项目运行后, 第一次编译时使用Tomcat中的jar。编写项目的时候, Eclipse找不到相关类( Eclipse自动编译), 所以要添加此依赖, 但是作用域只能是provided, 如果是compile和runtime项目运行后会和Tomcat中的jar冲突。
8.3. 运行时是在编译的时候不需要相关类, 但是运行的时候需要相关类, 经典的例子是Mysql驱动包, 编写代码的时候使用Java的标准类即可, 连接Mysql数据库的时候必须使用驱动包。
8.4. 测试作用域一般是我们的junit。
8.5. 系统阶段, 添加外部依赖使用。