- 教程
- 概述
- 环境设置(Environment Setup)
- POM
- 建立生命周期(Build Life Cycle)
- 构建配置文件(Build Profiles)
- 存储库(Repositories)
- 插件(Plug-ins)
- 创建项目(Creating Project)
- 构建和测试项目(Build & Test Project)
- 外部依赖(External Dependencies)
- 项目文件(Project Documents)
- Project 模板
- 快照(Snapshots)
- 构建自动化(Build Automation)
- 管理依赖关系(Manage Dependencies)
- 部署自动化(Deployment Automation)
- Web应用程序(Web Application)
- Eclipse IDE(Eclipse IDE)
- NetBeans(NetBeans)
- IntelliJ IDEA(IntelliJ IDEA)
- 问题与解答(Questions and Answers)
- 有用的资源
- Maven 面试问题(Maven Interview Questions)
- Maven 在线测试
- Maven 模拟测试(Maven Mock Test)
管理依赖关系(Manage Dependencies)
Maven的核心功能之一是依赖管理。 一旦我们处理多模块项目(由数百个模块/子项目组成),管理依赖项是一项艰巨的任务。 Maven提供高度的控制来管理这些场景。
传递依赖发现
通常情况下,当一个库(比如A)依赖于其他库时,比如说B.如果另一个项目C想要使用A,那么该项目也需要使用库B.
Maven有助于避免此类要求发现所需的所有库。 Maven通过读取依赖项的项目文件(pom.xml),找出它们的依赖关系等来实现这一点。
我们只需要在每个项目pom中定义直接依赖。 Maven自动处理其余部分。
通过传递依赖性,包含的库的图形可以在很大程度上快速增长。 当存在重复的库时,可能会出现案例。 Maven提供了很少的功能来控制传递依赖的程度。
Sr.No. | 功能和说明 |
---|---|
1 | Dependency mediation 确定在遇到多个版本的工件时要使用的依赖项版本。 如果两个依赖版本在依赖关系树中处于相同的深度,则将使用第一个声明的依赖关系。 |
2 | Dependency management 直接指定在传递依赖项中遇到它们时要使用的工件的版本。 对于示例项目,C可以在其依赖关系管理部分中包括B作为依赖关系,并且直接控制在引用它时使用哪个版本的B. |
3 | Dependency scope 根据构建的当前阶段包含依赖项。 |
4 | Excluded dependencies 可以使用“排除”元素排除任何传递依赖性。 例如,A取决于B,B取决于C,那么A可以将C标记为排除。 |
5 | Optional dependencies 可以使用“可选”元素将任何传递依赖项标记为可选。 例如,A取决于B,B取决于C.现在B将C标记为可选。 然后A不会用C. |
依赖范围
可以使用如下所述的各种依赖性范围来限制传递依赖性发现。
Sr.No. | 范围和描述 |
---|---|
1 | compile 此范围表示在项目的类路径中可以使用依赖项。 它是默认范围。 |
2 | provided 此范围表示JDK或web-Server/Container在运行时提供依赖性。 |
3 | runtime 此范围表示编译不需要依赖项,但在执行期间需要依赖项。 |
4 | test 此范围表示依赖项仅适用于测试编译和执行阶段。 |
5 | system 此范围表示您必须提供系统路径。 |
6 | import 此范围仅在依赖项为pom类型时使用。 此范围指示应使用该POM的部分中的依赖项替换指定的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的概念将公共依赖项放置在单个位置。 Root项目中列出了App-Data-lib和App-Core-lib项目的依赖关系(参见Root的包装类型。它是POM)。
无需在App-UI-WAR中将Lib1,lib2,Lib3指定为依赖项。 Maven使用Transitive Dependency Mechanism来管理这些细节。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论