您的位置:首页 > 其它

Maven的依赖机制介绍

2017-05-15 04:08 274 查看
以下内容引用自https://ayayui.gitbooks.io/tutorialspoint-maven/content/book/maven_manage_dependencies.html

一、前言

Maven的一个核心特性就是依赖管理。当我们涉及到多模块的项目(包含成百个模块或者子项目),管理依赖就变成一项困难的任务。Maven展示出了它对处理这种情形的高度控制。

二、可传递性依赖

一种相当常见的情况,当一个库,比如说A依赖于其他库B。假如,另外一个项目C想要使用A,那么项目也需要使用库B

Maven帮助避免这种要查明所有所需库的要求。Maven通过读取描述依赖的项目文件(pom.xml),找出它们的依赖类,来完成这项工作。

我们只需要做的是在每个项目的pom.xml中定义好直接的依赖。Maven会自动处理剩下的事情。

通过可传递性的依赖,被包含库的关系图可以迅速增加到一个很大的程度。当有多个库时可能就会有状况发生。Maven提供一些特性来控制可传递性依赖的大小。

特性描述
依赖调解(Dependency mediation

当遇到多个版本的artifact的时候,决定使用哪个版本的依赖。如果两个版本的依赖在依赖树种处于同一深度时,第一个被声明的依赖将被使用。
依赖管理(Dependency management

当在传递性依赖中遇到时,直接指定要使用的构件版本。举个例子,项目C可以在dependencyManagement部分配置包含B作为依赖,并且直接控制引用B时使用哪个版本的B
依赖作用域(Dependency scope

按照当前构建的阶段,配置包含的依赖。
排除依赖(Excluded dependencies

任何传递性的依赖都可以通过使用<exclusion>节点来排除。举个例子,A依赖于B并且B依赖于C,那么A可以标记C为排除在外的。
可选依赖(Optional dependencies

任何传递性的依赖都可以通过使用<optional>节点来标记为可选的。举个例子,A依赖于B并且B依赖于C,现在B标记C为可选的,那么A可以不使用C
三、依赖作用域(Dependency Scope)

可传递性依赖发现可以通过下面提到的各种依赖作用域来限制。

作用域(Scope)描述
compile此作用域表示项目classpath中的依赖可以使用,为默认作用域。
provided此作用域表示依赖将由JDK或者运行时的Web服务器或容器提供。
runtime此作用域表示依赖在编译时不需要,但在执行时需要。
test此作用域表示依赖只在测试编译和执行阶段可用。
system此作用域表示你必须提供系统路径。
import此作用域只在依赖是POM类型时使用。此作用域表示特定的POM需要替换成被引入的POM的部分中的依赖。
提示:这个作用于就是<dependency>节点下的<scope>。

四、依赖管理(Dependency Management)

通常我们有基于某个通用项目的一组项目。 在此情形下, 我们可以创建一个通用的POM来把所有的通用的依赖包含进来,并把这个POM作为子项目POM的父POM。下面的例子将帮助你理解这个概念。



接下来是上面依赖图的详情说明:

App-UI-WAR依赖于App-Core-libApp-Data-lib

RootApp-Core-libApp-Data-lib的父项目。

Root在它的依赖部分定义了Lib1Lib2Lib3作为依赖。

App-UI-WAR

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>
<groupId>com.companyname.groupname</groupId>
<artifactId>App-UI-WAR</artifactId>
<version>1.0</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>com.companyname.groupname</groupId>
<artifactId>App-Core-lib</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
<dependencies>
<dependency>
<groupId>com.companyname.groupname</groupId>
<artifactId>App-Data-lib</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</project>


App-Core-lib

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent>
<artifactId>Root</artifactId>
<groupId>com.companyname.groupname</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.companyname.groupname</groupId>
<artifactId>App-Core-lib</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
</project>


App-Data-lib

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent>
<artifactId>Root</artifactId>
<groupId>com.companyname.groupname</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.companyname.groupname</groupId>
<artifactId>App-Data-lib</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
</project>


Root

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>
<groupId>com.companyname.groupname</groupId>
<artifactId>Root</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<dependencies>
<dependency>
<groupId>com.companyname.groupname1</groupId>
<artifactId>Lib1</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
<dependencies>
<dependency>
<groupId>com.companyname.groupname2</groupId>
<artifactId>Lib2</artifactId>
<version>2.1</version>
</dependency>
</dependencies>
<dependencies>
<dependency>
<groupId>com.companyname.groupname3</groupId>
<artifactId>Lib3</artifactId>
<version>1.1</version>
</dependency>
</dependencies>
</project>


现在当我们构建App-UI-WAR项目时, Maven将通过遍历依赖关系图发现所有的依赖,并且构建此应用。

从上面的例子,我们可以学习到下面的几个关键概念:

通用依赖可以使用父POM的概念放置在单独的地方。App-Data-libApp-Core-lib项目的依赖是在Root项目中列出的。

App-UI-WAR项目中不需要指定Lib1Lib2Lib3作为依赖。Maven使用可传递性依赖机制(Transitive Dependency Mechanism)可处理这种细节。

五、其它参考

https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

https://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: