相信学 Maven 的都看过 Maven 的官网文档的
Introduction to Dependency Mechanism。在介绍直接依赖怎样影响间接依赖时,它给出了一个表格:
| compile | provided | runtime | test |
compile | compile | - | runtime | - |
provided | provided | provided | provided | - |
runtime | runtime | - | runtime | _ |
test | test | - | test | - |
表格的最左边的列是直接依赖的名字,最上面的行是间接依赖的名字。“-”表示依赖将被忽略,也就是没有依赖。比如 project-a 对 project-b 有 compile 依赖,project-b 对 project-c 有 runtime 依赖,那么根据表格 project-a 对 project-c 有 runtime 依赖。
我看这个表格时的第一反应是,依赖不是越变越强吗?怎么 compile 对上 runtime 变成 runtime 了?不应该是 compile 吗?仔细想想,如果 project-a 在编译期依赖 project-b,project-b 只是在运行期需要 project-c,那么 project-a 的确只是在运行期需要 project-c,编译时用不到它。相似地,表格中的每一种情况都能举出类似的例子。也就是,当 project-1 依赖 project-2,project-2 依赖 project-3……,最终,project-1 间接依赖了 project-n 的时候,project-1 对 project-n 的依赖性基本取决于依赖链中最弱的一环。为什么说是基本上呢?因为很多情况下依赖链走到某一步时就断了,依赖被忽略了,也就是说没有依赖了。比如 runtime 遇上 provided 就断了。
这么看这个表格就清晰了,每个单元格都对应行列中最弱的那个,甚至是“-”。在那什么情况下会出现“-”呢?test 列对应的单元格全部是“-”。因为如果 project-b只是在测试的时候需要 project-c,那么说明 project-a 根本就不需要依赖 project-c。比如你的项目依赖 Spring,而 Spring 在测试期几乎毫无悬念地会依赖 JUnit。你的项目肯定不会把 JUnit 作为依赖的。相似地,provided 列对应的单元格也基本上都是“-”。Provided-provided 有什么特殊的地方呢?如果 project-webapp 依赖 web server 的某个 jar,这个 jar 又依赖 servlet-api.jar,你的 project-webapp 就对 servlet-api.jar 有 provided 依赖。这个例子很牵强,不过很合情合理,对不对?从依赖管理的角度看,provided 依赖实在是太弱了,我觉得跟没有依赖也差不多了。
个人推荐一本书《Maven: The Definitive Guide》。浏览过官网的几个 introductions 之后再看此书速度奇快。官网文档不推荐太过仔细地看,毕竟 Apache 文档糟糕已经不是一天两天了~~~
分享到:
相关推荐
Maven依赖管理遵循“传递性”原则,即项目可以直接依赖其他项目,间接依赖也会被自动引入。当出现相同类路径的冲突时,Maven会遵循“第一声明者优先”原则,即先声明的依赖版本优先。 2. **排除依赖(Exclusions)...
【标题】"Maven运行依赖实例"涉及到的是在软件开发中使用Maven构建工具来管理和运行项目时,如何处理依赖关系的实际操作。Maven是一个强大的Java项目管理工具,它可以帮助开发者自动化构建、编译、测试、打包和部署...
6. **Maven 依赖树**:使用 `mvn dependency:tree` 命令可以查看项目的完整依赖树,帮助开发者了解所有直接和间接依赖的 jar 包。 7. **本地 Maven 仓库**:Maven 下载的 jar 包会被存储在用户的本地仓库中,默认...
例如,HelloWrold2间接依赖于Junit3.8和Junit4.0,由于Junit3.8离HelloWrold2更近,所以会优先选择Junit3.8。 2. **相同路径长度下的优先级**:如果两个相同依赖具有相同的路径长度,情况会分为两种: - **覆盖**...
1. **依赖分析**:该插件可以快速生成项目的完整依赖树,展示所有直接和间接依赖的库,让开发者一目了然地看到项目中所有的依赖关系。 2. **冲突检测**:在依赖树的基础上,MavenHelper能自动标记出存在版本冲突的...
此目标扫描项目以查找对传递依赖项的类的引用,并将相应的依赖项作为直接依赖项添加到pom.xml中 “帮助” Maven目标 要显示在线帮助,请执行以下操作: # display available goals mvn ...
Maven遵循“最接近原则”来解决依赖冲突,即优先使用项目直接声明的依赖版本,而非间接依赖的版本。此外,还可以通过 `<dependencyManagement>` 标签来统一管理多个模块间的依赖版本。 ** Maven生命周期与构建阶段 ...
同时,Maven还处理依赖的传递性,即如果一个依赖自身又依赖其他库,Maven会自动处理这些间接依赖。 构建过程在Maven中是标准化的,包括编译、测试、打包、验证和部署等阶段。通过简单的命令,如`mvn clean install`...
当一个项目间接依赖了不同版本的同一个库时,就会出现冲突。例如,如果项目直接依赖A和B,而A需要C1版本,B需要C2版本,Maven会优先选择路径较短的依赖,即距离项目最近的那个版本。这种情况可能导致代码运行时出现...
在依赖管理方面,Maven遵循“传递性依赖”原则,即如果项目A依赖于项目B,项目B又依赖于项目C,那么项目A实际上也间接依赖于项目C。Maven会自动处理这些依赖关系,但同时也会处理版本冲突问题。如果出现版本冲突,...
在IDEA或Eclipse等集成开发环境中,你可以清晰地看到哪些依赖直接或间接引入了冲突,从而快速定位问题。 2. **选择性排除依赖(Exclusion Picker)** 当你发现某个冲突的jar包时,Maven Helper允许你选择性地排除...
Maven首先解析`pom.xml`中的直接依赖,然后按照依赖的版本管理和依赖管理规则来处理间接依赖。对于版本冲突,Maven使用“nearest wins”策略,即离当前模块最近的版本优先。 2. **版本冲突解决**: 如果两个或多...
- Maven使用传递性依赖管理,一个项目依赖的库可能间接依赖其他库,Maven会自动处理这些依赖关系。 - 当出现依赖冲突时,可以通过 `<dependencyManagement>` 标签进行统一管理,或者使用 `<exclusions>` 标签排除...
Maven采用“最接近原则”解决依赖冲突,即优先选择项目直接声明的依赖版本,而不是间接依赖的版本。 8. Maven插件: Maven除了管理常规的JAR依赖外,还有用于构建、测试、打包等任务的插件,它们也是以JAR的形式...
默认策略是“最接近原则”,优先使用直接依赖的版本,而非间接依赖的版本。 5. **生命周期与插件**:Maven有一套预定义的生命周期,如clean、compile、test、package、install和deploy等,每个阶段都可以绑定特定的...
这个项目的核心在于,它帮助开发者方便地获取指定Maven Artifact的所有直接和间接依赖项,这对于理解和管理大型项目或库的依赖结构至关重要。 Maven的依赖管理机制是通过POM(Project Object Model)文件来实现的。...
Maven提供了`dependency:go-offline`目标,用于下载所有直接和间接依赖,以便在离线模式下工作。这个bat文件就是基于这个目标创建的,它自动化了这个过程,使得开发者只需点击一次即可完成下载。 使用该bat文件前,...
此外,Maven还能处理依赖关系的传递性,即如果一个项目依赖A,A又依赖B,Maven会自动添加B作为项目的间接依赖。 ### 存储库和坐标 Maven使用仓库系统来存储和检索依赖。默认的中央仓库包含了大量开源Java项目的JAR...