`
m635674608
  • 浏览: 5041322 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

maven 传递依赖

 
阅读更多
依赖范围影响传递性依赖(左边第一行标示第一直接依赖范围,对上面第一行标示第二直接依赖范围,中间的交叉单元格标示传递性依赖范围)   compile test provided runtime

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传递依赖和依赖的规则.docx

    **一、Maven传递依赖** 传递依赖是指在Maven项目中,当一个项目A依赖于另一个项目B,而项目B又依赖于项目C时,项目A间接地依赖于项目C。这种关系使得A可以通过B来间接获取到C的类和资源。但是,并非所有的传递依赖...

    Maven的依赖验证项目

    Maven的依赖机制遵循“传递性”原则,这意味着如果你的项目依赖A,而A又依赖B,那么Maven会自动将B也引入到你的项目中。但是,这可能导致版本冲突,因此Maven提供了`exclusions`标签来排除不需要的依赖。 在进行...

    maven依赖小例子

    Maven依赖管理遵循“传递性”原则,即如果你的项目依赖A库,而A库又依赖B库,Maven会自动将B库也一并引入。这大大简化了项目的构建过程,但同时也可能导致依赖冲突,需要通过排除机制或调整依赖版本来解决。 在`...

    Maven 依赖详细理解.pdf

    Maven是Apache软件基金会的一个项目,用于项目对象模型(Project Object Model)的管理和构建自动化。...通过合理地使用POM文件、依赖范围、依赖调解和传递性依赖等机制,我们可以更好地构建和维护我们的Maven项目。

    maven依赖库 - maven_repository.zip

    Maven依赖库是开发Java应用程序时不可或缺的资源,它包含了各种常用的jar包,这些包提供了丰富的功能,涵盖了数据处理、网络通信、XML解析等多个领域。在本文中,我们将深入探讨maven_repository.zip压缩包中的几个...

    ​实现maven项目中多版本依赖兼容使用解决方案

    Maven依赖管理遵循“传递性”原则,即项目可以直接依赖其他项目,间接依赖也会被自动引入。当出现相同类路径的冲突时,Maven会遵循“第一声明者优先”原则,即先声明的依赖版本优先。 2. **排除依赖(Exclusions)...

    apache-maven3.5 依赖包

    2. **理解依赖传递性**:Maven会自动处理依赖的依赖,但可能会导致依赖冲突,需要通过 `&lt;exclusions&gt;` 标签排除不需要的子依赖。 3. **管理本地仓库**:定期清理无用的旧版本依赖,避免仓库过大影响性能。 4. **使用...

    ojdbc8的maven依赖

    在Maven项目中,正确配置ojdbc8的依赖对于确保应用程序能够顺利连接到Oracle数据库至关重要。本文将深入探讨ojdbc8在Maven中的使用、依赖配置以及其相关知识点。 首先,了解ojdbc8的基本信息是必要的。ojdbc8是...

    webservices客户端maven依赖

    综上所述,这个Maven项目配置了一系列关键的依赖库,旨在构建一个功能完善的Web服务客户端。通过对这些依赖的详细了解,可以帮助开发者更好地理解和维护项目,同时也有助于进一步扩展项目功能。

    Maven依赖管理项目构建工具.pdf

    Maven依赖传递特性 Maven会自动处理项目的依赖及其依赖的依赖,称为依赖传递。 2. Maven依赖冲突特性 当不同依赖引入了相同但不同版本的库时,会产生依赖冲突。Maven遵循“nearest wins”原则解决冲突,但可能需要...

    maven依赖包

    此外,Maven的传递性依赖管理意味着,如果一个项目依赖A库,而A库又依赖B库,Maven会自动处理B库的下载,无需开发者手动介入。 在压缩包子文件的文件名称列表中提到的"org",这很可能是Maven依赖的组织...

    Maven本地仓库依赖环境

    在实际开发中,你可能需要将这些库添加到你的项目依赖中,或者作为共享资源在团队间传递。 在`pom.xml`文件中,依赖管理是通过`&lt;dependency&gt;`标签实现的。例如: ```xml &lt;groupId&gt;com.example&lt;/groupId&gt; ...

    maven依赖本地jar包

    - **依赖隔离**:使用`&lt;scope&gt;system&lt;/scope&gt;`时,依赖关系仅限于当前项目,不会传递给下游项目。因此,在多模块项目中,需要在每个使用该JAR的模块中重复配置。 - **路径问题**:如果项目在不同的机器上构建,硬...

    Maven依赖包(用于博客项目)

    这意味着,当你声明一个依赖时,Maven会自动处理该依赖所依赖的其他库,直到没有更多的传递性依赖为止。这大大减少了项目中可能出现的版本冲突问题。 在博客项目中,可能包含的依赖可能有: 1. 数据库连接驱动:如...

    rules_maven:具有Bazel的传递Maven依赖项

    声明一个外部工作空间,该工作空间定义了一组Maven工件的传递依赖项。 状态:试验中,但正在其他内部项目中积极使用。 用法 1.将rules_maven添加到您的WORKSPACE git_repository ( name = "org_pubref_rules_...

    maven 关于 scope test 和 继承传递的问题

    本文将深入探讨"Maven中scope test的使用以及依赖继承传递"这一主题,帮助开发者更好地理解和应用Maven的核心特性。 首先,`scope test`是Maven依赖管理中的一个关键概念。当我们在`pom.xml`文件中为某个依赖设置`...

    java依赖管理工具maven

    Maven的依赖管理机制遵循“传递性依赖”原则,意味着项目中声明的每个依赖及其子依赖都会被自动管理。 “apache-maven-3.2.1”是Maven的一个特定版本,包含了Maven的可执行文件和必要的库文件。这个版本适用于...

    depcheck-maven-plugin:Maven插件可检查已使用的未使用的直接和已使用的间接(传递)依赖项

    此目标扫描项目以查找对传递依赖项的类的引用,并将相应的依赖项作为直接依赖项添加到pom.xml中 “帮助” Maven目标 要显示在线帮助,请执行以下操作: # display available goals mvn ...

Global site tag (gtag.js) - Google Analytics