Maven传递依赖
依赖的传递性。通过依赖设置解决了项目的CLASSPATH 问题,实际情况是我们依赖的项目其本身也是依赖其他的项目的,
如我依赖commons-email,而commons-email 需要依赖JavaMail 和JAF,这个时候,Maven 会自动处理这个依赖传递,会将JavaMail 和JAF 也会加入到CLASSPATH 中,通过这种传递地址,可以确保依赖的完整性,保证程序的正常运行。
maven会根据groupId和artifactId来进行依赖去重,maven最终只取一个artifact,去重多版本。(去重的依据:第一是路径最短优先,第二是声明优先),
如果App1依赖A,A依赖1.0 版本的F,App1 同时依赖B,B 依赖1.1 版本的F,App1 还依赖C,C 本身依赖D,D依赖1.2 版本的F,如下图:
那么App1 依赖哪个版本的F?
Maven在这里处理有两个机制,
第一是路径最短优先
第二是声明优先
假设我们将App1 设为根节点,那么F:1.0 距离根节点的路径为2,F:1.1也为2,F:1.2 为3,那么根据最短路径原则F:1.2 被淘汰。
在同为路径2 的F:1.0 和F1.1 之间根据声明优先原则,F:1.0是在A声明中引入的,而A 声明在先,那么F:1.0胜出,App1最终依赖的F 版本为1.0。
在pom.xml中dependency越下面,那么越先声明。
但是项目确实需要F:1.2,如何将F:1.2 加入到项目的CLASSPATH 中呢?
这里有两个方法:优先声明和依赖排除(Exclusion)。
声明优先:
前面说到最短路径原则,如果我在App1的pom.xml声明之间依赖F:1.2,那么F:1.2与项目根节点的路径为1,而F:1.0 和F:1.1 的路径都为2,则F:1.2 胜出,项目依赖F:1.2。
依赖排除:
指在声明依赖时,指明排除对某一项目的依赖,如在依赖hibernate-core 3.3.1.GA 时,排除对slf4j-api(排除时需要指明groupId 和artifactId,不需要指明version),这样就可以断开依赖的链,依赖就不会传递下去。依赖排除声明如下:
回到App1 项目中,如果我们在声明A依赖时排除对F的依赖,声明B 时排除对F的依赖,那么D 依赖的F:1.2 就会胜出,项目就会依赖F:1.2 啦。 所以让App1 依赖F:1.2 的结构如下(声明优先和依赖排除选一即可):
说明一下,依赖去重是基于groupId和artifactId完全一致才生效的。(不需要version)
一个反面的例子,很多开发人员会问,我的WEB-INF/lib目录下怎么出现两个jdom.jar?一个是1.0的,一个1.1的。
这里说明一下: jdom 1.0的groupId 是jdom,而jdom 1.1的groupId是org.jdom,两者groupId 不一致(虽然artifactId 是一样的),无法使用依赖去重,
Maven认为这两个jar 包完全不相关,而不是一个artifact 的两个版本,所以这两个jar 包都出现在lib 目录下啦。
这种情况在开源项目中很常见:刚开始,一个程序员写了一个小项目,groupId直接为项目名称:com.xxx;后来越做越大,被Apache ASF 采纳,groupId 调整为org.apache.xxx;
最后觉得约束太大,又想单飞,做一个新的产品,如org.xxx。回顾这个产品,groupId 变了三次,如果设置不好,你的lib 目录下可能出现该项目的三个jar包,
iBATIS就是这个例子,groupId 分别是: com.ibatis -> org.apache.ibatis -> org.mybatis,这个一定要注意一下。
相关推荐
**一、Maven传递依赖** 传递依赖是指在Maven项目中,当一个项目A依赖于另一个项目B,而项目B又依赖于项目C时,项目A间接地依赖于项目C。这种关系使得A可以通过B来间接获取到C的类和资源。但是,并非所有的传递依赖...
Maven的依赖机制遵循“传递性”原则,这意味着如果你的项目依赖A,而A又依赖B,那么Maven会自动将B也引入到你的项目中。但是,这可能导致版本冲突,因此Maven提供了`exclusions`标签来排除不需要的依赖。 在进行...
Maven依赖管理遵循“传递性”原则,即如果你的项目依赖A库,而A库又依赖B库,Maven会自动将B库也一并引入。这大大简化了项目的构建过程,但同时也可能导致依赖冲突,需要通过排除机制或调整依赖版本来解决。 在`...
Maven是Apache软件基金会的一个项目,用于项目对象模型(Project Object Model)的管理和构建自动化。...通过合理地使用POM文件、依赖范围、依赖调解和传递性依赖等机制,我们可以更好地构建和维护我们的Maven项目。
Maven依赖库是开发Java应用程序时不可或缺的资源,它包含了各种常用的jar包,这些包提供了丰富的功能,涵盖了数据处理、网络通信、XML解析等多个领域。在本文中,我们将深入探讨maven_repository.zip压缩包中的几个...
Maven依赖管理遵循“传递性”原则,即项目可以直接依赖其他项目,间接依赖也会被自动引入。当出现相同类路径的冲突时,Maven会遵循“第一声明者优先”原则,即先声明的依赖版本优先。 2. **排除依赖(Exclusions)...
2. **理解依赖传递性**:Maven会自动处理依赖的依赖,但可能会导致依赖冲突,需要通过 `<exclusions>` 标签排除不需要的子依赖。 3. **管理本地仓库**:定期清理无用的旧版本依赖,避免仓库过大影响性能。 4. **使用...
在Maven项目中,正确配置ojdbc8的依赖对于确保应用程序能够顺利连接到Oracle数据库至关重要。本文将深入探讨ojdbc8在Maven中的使用、依赖配置以及其相关知识点。 首先,了解ojdbc8的基本信息是必要的。ojdbc8是...
综上所述,这个Maven项目配置了一系列关键的依赖库,旨在构建一个功能完善的Web服务客户端。通过对这些依赖的详细了解,可以帮助开发者更好地理解和维护项目,同时也有助于进一步扩展项目功能。
Maven依赖传递特性 Maven会自动处理项目的依赖及其依赖的依赖,称为依赖传递。 2. Maven依赖冲突特性 当不同依赖引入了相同但不同版本的库时,会产生依赖冲突。Maven遵循“nearest wins”原则解决冲突,但可能需要...
此外,Maven的传递性依赖管理意味着,如果一个项目依赖A库,而A库又依赖B库,Maven会自动处理B库的下载,无需开发者手动介入。 在压缩包子文件的文件名称列表中提到的"org",这很可能是Maven依赖的组织...
在实际开发中,你可能需要将这些库添加到你的项目依赖中,或者作为共享资源在团队间传递。 在`pom.xml`文件中,依赖管理是通过`<dependency>`标签实现的。例如: ```xml <groupId>com.example</groupId> ...
- **依赖隔离**:使用`<scope>system</scope>`时,依赖关系仅限于当前项目,不会传递给下游项目。因此,在多模块项目中,需要在每个使用该JAR的模块中重复配置。 - **路径问题**:如果项目在不同的机器上构建,硬...
这意味着,当你声明一个依赖时,Maven会自动处理该依赖所依赖的其他库,直到没有更多的传递性依赖为止。这大大减少了项目中可能出现的版本冲突问题。 在博客项目中,可能包含的依赖可能有: 1. 数据库连接驱动:如...
声明一个外部工作空间,该工作空间定义了一组Maven工件的传递依赖项。 状态:试验中,但正在其他内部项目中积极使用。 用法 1.将rules_maven添加到您的WORKSPACE git_repository ( name = "org_pubref_rules_...
本文将深入探讨"Maven中scope test的使用以及依赖继承传递"这一主题,帮助开发者更好地理解和应用Maven的核心特性。 首先,`scope test`是Maven依赖管理中的一个关键概念。当我们在`pom.xml`文件中为某个依赖设置`...
Maven的依赖管理机制遵循“传递性依赖”原则,意味着项目中声明的每个依赖及其子依赖都会被自动管理。 “apache-maven-3.2.1”是Maven的一个特定版本,包含了Maven的可执行文件和必要的库文件。这个版本适用于...
此目标扫描项目以查找对传递依赖项的类的引用,并将相应的依赖项作为直接依赖项添加到pom.xml中 “帮助” Maven目标 要显示在线帮助,请执行以下操作: # display available goals mvn ...