Maven的亮点之一就是依赖管理,其介绍依赖管理的产品文档竟然长达15页之多,可能这个概念的复杂度不是很小,值得关注,值得学习。
以下是一个POM中典型的一段关于依赖的片段:
<!--Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/-->
<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">
...
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<type>jar</type>
<scope>test</scope>
<optional>true</optional>
</dependency>
...
</dependencies>
...
</project>
1、Transitive Dependency (传递依赖)
你的项目依赖于A,A又依赖于B。你的项目是否要声明你依赖于B? Maven的回答是它帮你自动管理这种依赖的传递,你不需要声明你依赖于B,由Maven来做。
不难就会想到一种冲突的情况,如A -> B -> C -> D 2.0,同时存在A -> E -> D 1.0,那么应该使用D1.0还是D2.0呢?用Maven的话来说,这件事情叫做“Dependency Mediation”(依赖仲裁),当出现这种冲突时,采用“Nearest Definition”的解决办法,即采用最短路径,在上述例子中仲裁的结果是D1.0,因为它的路径更短。如果两个路径长短是一样的呢?那么只能是谁先出现就选谁了。上述例子中如果你显式声明A依赖于D2.0,那么Maven就会帮你选取D2.0而不是D1.0。
2、Dependency Scope (依赖范围)
举例来说,你开发时需要做测试,你需要依赖于junit的jar,但是部署应用时并不需要它,因为单元测试不会在生产环境上跑,也就是说最终打包的jar或者war不包含junit的jar。又如你开发web程序,你的servlet/jsp进行编译需要依赖于servlet-jsp的标准api(J2EE的jar),但是部署时也是不需要它的,因为你的应用服务器肯定有这些东西。
因此,Maven考虑了6中可能的scope供选择:
- compile: 默认的scope。编译、测试、打包全都需要。compile参与依赖传递,就是说,你的项目A依赖于B(依赖scope是compile),项目C依赖于你的项目A,那么C也就依赖于B。
- provided: 表示JDK或者容器会在Runtime时提供这些(jar),如上面说到的servlet api。provided的东西在编译和测试时会用到,不参与传递依赖。
- runtime: 表示编译时不需要,但测试和运行时需要,最终打包时会包含进去。
- test: 只用于测试阶段(测试的编译和测试的运行),典型的就是junit的jar。
- system: 和provided类似,但要求jar是你的系统里已有的,不会在repository里找,如rt.jar,tools.jar这些。
- import: 简单的说,你的项目的pom可以继承另一个项目的pom,从而继承了父项目的依赖关系,但是因为之后single inheritance的限制,所以创造了import,使得你可以“导入”或者说“继承”任何一到多个项目的依赖关系。
如果你要考虑更细一些,你的项目依赖于A(scope1),A依赖于B(scope2),那么你的项目对B的依赖应该算是哪个scope呢?官方文档上有个表格,列举了scope1和scope2的一个矩阵关系(各自都可能是compile/provided/runtime/test),然后最后结果应该是什么。
3、Dependency Classier
用于再次区分不同类别的东西,如在jdk1.4下编译的东西还是jdk1.5下出来的云云。
分享到:
相关推荐
今天,我们将详细介绍 Maven 依赖管理机制中的两个重要概念:dependencies 和 dependencyManagement。 dependencies dependencies 是 Maven 项目中最基本的依赖管理机制。它定义了项目中需要的依赖项,包括 jar 包...
dependencyManagement 是表⽰依赖 jar 包的声明,即你在项⽬中的 dependencyManagement 下声明了依赖,maven 不会加 载该依赖,dependencyManagement 声明可以被继承。 dependencyManagement 的⼀个使⽤案例是当有⽗...
当多个依赖有相同的`groupId`和`artifactId`但不同版本时,Maven会根据`dependencyManagement`来解决冲突。 4. **测试框架集成** Maven支持与JUnit、TestNG等测试框架集成,通过`maven-surefire-plugin`插件运行...
如果无法解决冲突,可以使用`dependencyManagement`标签来统一管理所有模块的依赖版本。 总的来说,Maven的依赖管理是其强大功能的一部分,它极大地简化了Java项目的构建流程,让开发者能够更专注于代码编写,而...
在Maven项目中,`dependencyManagement`和`dependencies`元素都是用来管理项目依赖的重要部分,但它们的作用方式有所不同。理解这两个元素的区别对于构建稳定、可维护的多模块项目至关重要。 一、dependency...
依赖管理插件 ... 要了解有关使用Dependency Management插件的更多信息,请参阅其。 贡献 该项目的贡献者同意遵守其。 是受欢迎的。 有关详细信息,请参见。 执照 依赖性管理插件是在下发行的开源软件。
5. **解决依赖问题**:如果遇到依赖冲突,Maven遵循“最接近原则”(nearest wins)进行解决,但也可以通过调整POM中的dependencyManagement来全局控制依赖版本。 6. **使用Maven仓库**:除了中央仓库外,还可以...
这样,您可以确保您不会浪费时间在Apache Maven范围之外的东西上。 假设您的问题不存在,请提交该问题的票证。 清楚地描述问题,包括在出现错误时重现的步骤。 确保填写您知道存在问题的最早版本。 在GitHub上...
3. **依赖管理(Dependency Management)**: Maven通过POM文件管理项目的依赖关系,自动下载所需的库文件,避免了类路径冲突问题。只需在POM文件中声明依赖,Maven会自动处理。 4. **仓库(Repository)**: Maven...
标题 "20220609-maven依赖" 暗示了这是一个关于Maven项目构建和依赖管理的主题。Maven是Java开发中的一个关键工具,它通过使用一种标准化的方式来管理和构建项目,使得依赖库的下载、编译、打包和部署变得简单。在这...
本插件参考58开源插件MavenManager,采用dependencyManagement方式,一键解决Java开发过程中使用maven作为依赖管理时的jar包依赖冲突问题,相比MavenHelper更加省时省力,jar包版本采用最新版本号原则
在Java开发领域,Maven是一个广泛使用的项目管理和综合工具,它通过XML格式的配置文件管理项目的构建、报告和依赖关系。本示例“简单的maven父子依赖的sample”旨在介绍如何在Maven项目中设置父子模块间的依赖关系,...
"Maven 项目 pom.xml 中 parent 标签的使用" ...Maven 项目 pom.xml 文件中的 parent 标签和 `<dependencyManagement>` 标签是依赖管理的核心组件,它们可以简化项目间的依赖管理,使得项目结构更加清晰、易于维护。
2. **继承依赖**:父`pom.xml`可以使用`<dependencyManagement>`标签来管理所有子模块的依赖,这样在子模块中只需声明artifactId,无需指定完整版本信息。这有助于保持项目一致性,避免因版本冲突引发的问题。 3. *...
通过父模块的`dependencyManagement`部分,可以集中定义所有依赖的版本,避免版本冲突。子模块只需声明依赖,而无需指定版本。 六、构建与编译 使用Maven,可以方便地进行项目的构建和编译。运行`mvn clean install...
然而,Maven使用的是`pom.xml`中的`dependencyManagement`部分来统一管理项目中所有模块的依赖版本。 ### 二、Gradle DMA Plugin的核心功能 1. **统一依赖版本**:通过配置,DMA插件可以让Gradle项目像Maven一样,...
Maven包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System)。 安装步骤 先下载,下载完成后,解压到某个目录 ...
《 Maven依赖管理详解与资源包应用指南》 在软件开发过程中,依赖管理是至关重要的一个环节,尤其是在Java世界中,Maven作为主流的构建工具,它的依赖管理功能为开发者提供了极大的便利。本资源包"maven-...