
Maven 一个核心的特性就是依赖管理。当我们处理多模块的项目包含成百上千个模块或者子项目模块间的依赖关系就变得非常复杂管理也变得很困难。针对此种情形Maven 提供了一种高度控制的方法。可传递性依赖发现一种相当常见的情况比如说 A 依赖于其他库 B。如果另外一个项目 C 想要使用 A 那么 C 项目也需要使用库 B。Maven 可以避免去搜索所有所需库的需求。Maven 通过读取项目文件pom.xml找出它们项目之间的依赖关系。我们需要做的只是在每个项目的 pom 中定义好直接的依赖关系。其他的事情 Maven 会帮我们搞定。通过可传递性的依赖所有被包含的库的图形会快速的增长。当有重复库时可能出现的情形将会持续上升。Maven 提供一些功能来控制可传递的依赖的程度。功能功能描述依赖调节决定当多个手动创建的版本同时出现时哪个依赖版本将会被使用。 如果两个依赖版本在依赖树里的深度是一样的时候第一个被声明的依赖将会被使用。依赖管理可以直接指定手动创建的某个版本供使用。例如假设项目 C 包含了项目 B 作为其依赖项而项目 B 又依赖于项目 A。在这种情况下可以明确指定在项目 B 被引用时使用的项目 A 的版本。这意味着您可以控制项目 A 的哪个特定版本会被项目 B 使用。依赖范围包含在构建过程每个阶段的依赖。依赖排除任何可传递的依赖都可以通过 exclusion 元素被排除在外。举例说明A 依赖 B B 依赖 C因此 A 可以标记 C 为 被排除的。依赖可选任何可传递的依赖可以被标记为可选的通过使用 optional 元素。例如A 依赖 B B 依赖 C。因此B 可以标记 C 为可选的 这样 A 就可以不再使用 C。依赖范围传递依赖发现可以通过使用如下的依赖范围来得到限制范围描述编译阶段该范围表明相关依赖是只在项目的类路径下有效。默认取值。供应阶段该范围表明相关依赖是由运行时的 JDK 或者 网络服务器提供的。运行阶段该范围表明相关依赖在编译阶段不是必须的但是在执行阶段是必须的。测试阶段该范围表明相关依赖只在测试编译阶段和执行阶段。系统阶段该范围表明你需要提供一个系统路径。导入阶段该范围只在依赖是一个 pom 里定义的依赖时使用。同时当前项目的POM 文件的 部分定义的依赖关系可以取代某特定的 POM。依赖管理通常情况下在一个共通的项目下有一系列的项目。在这种情况下我们可以创建一个公共依赖的 pom 文件该 pom 包含所有的公共的依赖关系我们称其为其他子项目 pom 的 pom 父。 接下来的一个例子可以帮助你更好的理解这个概念。接下来是上面依赖图的详情说明App-UI-WAR 依赖于 App-Core-lib 和 App-Data-lib。Root 是 App-Core-lib 和 App-Data-lib 的父项目。Root 在它的依赖部分定义了 Lib1、lib2 和 Lib3 作为依赖。App-UI-WAR 的 pom.xml 文件代码如下project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion groupIdcom.companyname.groupname/groupId artifactIdApp-UI-WAR/artifactId version1.0/version packagingwar/packaging dependencies dependency groupIdcom.companyname.groupname/groupId artifactIdApp-Core-lib/artifactId version1.0/version /dependency /dependencies dependencies dependency groupIdcom.companyname.groupname/groupId artifactIdApp-Data-lib/artifactId version1.0/version /dependency /dependencies /projectApp-Core-lib 的 pom.xml 文件代码如下project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd parent artifactIdRoot/artifactId groupIdcom.companyname.groupname/groupId version1.0/version /parent modelVersion4.0.0/modelVersion groupIdcom.companyname.groupname/groupId artifactIdApp-Core-lib/artifactId version1.0/version packagingjar/packaging /projectApp-Data-lib 的 pom.xml 文件代码如下project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd parent artifactIdRoot/artifactId groupIdcom.companyname.groupname/groupId version1.0/version /parent modelVersion4.0.0/modelVersion groupIdcom.companyname.groupname/groupId artifactIdApp-Data-lib/artifactId version1.0/version packagingjar/packaging /projectRoot 的 pom.xml 文件代码如下project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion groupIdcom.companyname.groupname/groupId artifactIdRoot/artifactId version1.0/version packagingpom/packaging dependencies dependency groupIdcom.companyname.groupname1/groupId artifactIdLib1/artifactId version1.0/version /dependency /dependencies dependencies dependency groupIdcom.companyname.groupname2/groupId artifactIdLib2/artifactId version2.1/version /dependency /dependencies dependencies dependency groupIdcom.companyname.groupname3/groupId artifactIdLib3/artifactId version1.1/version /dependency /dependencies /project现在当我们构建 App-UI-WAR 项目时 Maven 将通过遍历依赖关系图找到所有的依赖关系并且构建该应用程序。通过上面的例子我们可以学习到以下关键概念公共的依赖可以使用 pom 父的概念被统一放在一起。App-Data-lib 和 App-Core-lib 项目的依赖在 Root 项目里列举了出来参考 Root 的包类型它是一个 POM.没有必要在 App-UI-W 里声明 Lib1, lib2, Lib3 是它的依赖。 Maven 通过使用可传递的依赖机制来实现该细节。