Maven的核心功能之一是依赖管理.一旦我们处理多模块项目(由数百个模块/子项目组成),管理依赖项是一项艰巨的任务. Maven提供了高度的控制来管理这些场景.
通常情况下,当一个库,说A ,取决于其他库,比如B.如果另一个项目C想要使用A,那么该项目也需要使用库B.
Maven有助于避免这些要求发现所有需要图书馆. Maven通过读取依赖项的项目文件(pom.xml),找出它们的依赖关系等来实现这一点.
我们只需要在每个项目pom中定义直接依赖. Maven自动处理其余部分.
通过传递依赖性,包含的库的图形可以在很大程度上快速增长.当存在重复的库时,可能会出现这种情况Maven提供了很少的功能来控制传递依赖的程度.
Sr.No. | 功能&说明 |
---|---|
1 | 依赖调解 确定遇到多个版本的工件时要使用的依赖项版本.如果两个依赖版本在依赖关系树中处于相同的深度,则将使用第一个声明的依赖关系. |
2 | 依赖关系管理 直接指定遇到问题时要使用的工件版本在传递依赖中.对于示例项目,C可以在其依赖关系管理部分中包含B作为依赖关系,并直接控制在引用它时使用哪个版本的B. |
3 | 依赖范围 包含依赖关系根据构建的当前阶段. |
4 | 排除的依赖项 可以使用"排除"元素排除任何传递依赖项.例如,A取决于B,B取决于C,那么A可以将C标记为排除. |
5 | 可选依赖项 使用"可选"元素可以将任何传递依赖项标记为可选.例如,A取决于B,B取决于C.现在B将C标记为可选.然后A不会使用C. |
传递依赖关系可以使用如下所述的各种依赖关系范围来限制发现.
Sr.否. | 范围&说明 |
---|---|
1 | 编译 此范围表示在项目的类路径中可以使用依赖项.它是默认范围. |
2 | 提供 此范围表示JDK或web-Server/Container在运行时提供依赖关系. |
3 | 运行时间 此范围表示编译时不需要依赖项,但在执行期间需要依赖项. |
4 | 测试 此范围表明依赖关系仅适用于测试编译和执行阶段. |
5 | 系统 此范围表示您必须提供系统路径. |
6 | import 此范围仅在依赖性为pom.此范围表示应该用POM的< dependencyManagement>中的依赖项替换指定的POM.部分. |
通常,我们有一个共同项目下的一组项目.在这种情况下,我们可以创建一个具有所有公共依赖关系的公共pom,然后创建这个pom,即子项目的poms的父级.下面的例子将帮助您理解这个概念.
关注是上述依赖图的详细信息 :
App-UI-WAR依赖于App-Core-lib和App-Data- lib.
Root是App-Core-lib和App-Data-lib的父.
Root将Lib1,lib2,Lib3定义为依赖关系它的依赖部分.
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-lib 和 App-Core-lib 项目的依赖关系列在 Root 项目中(参见Root的打包类型.它是POM).
在App-UI-WAR中不需要指定Lib1,lib2,Lib3作为依赖项. Maven使用传递依赖机制来管理这些细节.