compile |
compile |
--- |
--- |
runtime |
test |
test |
--- |
--- |
test |
provided |
provided |
--- |
provided |
provided |
runtime |
runtime |
--- |
--- |
runtime |
-
当第二依赖的范围是compile的时候,传递性依赖的范围与第一直接依赖的范围一致。
-
当第二直接依赖的范围是test的时候,依赖不会得以传递。
-
当第二依赖的范围是provided的时候,只传递第一直接依赖范围也为provided的依赖,且传递性依赖的范围同样为 provided;
-
当第二直接依赖的范围是runtime的时候,传递性依赖的范围与第一直接依赖的范围一致,但compile例外,此时传递的依赖范围为runtime;
A-->C B-->A ==>B-->C(这种依赖是基于compile这个范围进行传递)
在dependency配置中如果没有写scope默认就是compile范围,依赖的传递主要是针对compile作用域
依赖的范围:
test范围指的是测试范围有效,在编译和打包时都不会使用这个依赖
compile范围指的是编译范围有效,在编译和打包时都会将依赖存储进去
provided范围指的是在编译和测试的过程有效,最后生成war包时不会加入,诸如:servlet-api,因为servlet-api,tomcat等web服务器已经存在了,如果再打包会冲突
runtime在运行的时候依赖,在编译的时候不依赖
依赖冲突
1、如果a依赖于b的1.0版本,c依赖于b的1.1版本,d依赖于a和c,这时在d的pom中哪一个依赖先写就使用先写依赖的版本
2、如果a依赖于b的1.0版本,c依赖于b的1.1版本,d依赖于a和c,f依赖于d和c,依赖的路径的长短不一致就选择最小的
3、如果希望精确的控制依赖包,可以使用依赖的排除功能——>exclusions来排除
传递依赖是maven最有特色的、最为方便的优点之一,可以省了很多配置。如a 依赖 b,b 依赖c 默认 a也会依赖 c。但是 也会带来隐患,如版本冲突。当然maven也考虑到解决办法,可以使用exclusions来排除相应的重复依赖。
但是我们还会遇到一个严重的问题,那就是,我怎么知道是哪个包的传递依赖产生的冲突 ?那该怎么办呢?当然,maven也会有相应的解决方案。
首先,你要在pom.xml中加上maven-project-info-reports-plugin插件。
<reporting>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>
maven-project-info-reports-plugin
</artifactId>
</plugin>
</reporting>
然后再执行:mvn project-info-reports:dependencies 。生成项目依赖的报表,这样你就能够在报表中找出你版本冲突的相关性依赖了。
最后在相应的dependency中加上exclusions来排除相关的传递依赖。
例:
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.1</version>
<exclusions>
<exclusion>
<groupId>com.ibm.icu</groupId>
<artifactId>icu4j</artifactId>
</exclusion>
</exclusions>
<scope>runtime</scope>
</dependency>
相关推荐
**一、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 ...