`
ZXY_920823
  • 浏览: 24364 次
社区版块
存档分类
最新评论

maven传递依赖规则

阅读更多
用maven很长时间了(2年),下面把一些需要注意的细节加以总结:
情景一:
learn-1 pom.xml
<dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-core</artifactId>
     <version>4.1.4.RELEASE</version>
     <!--依赖commons-logging 1.2的版本-->
</dependency>
<dependency>
      <groupId>com.learn</groupId>
      <artifactId>learn2</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <!--依赖commons-logging 1.1.3的版本-->
      <optional>true</optional>     
</dependency>

learn-2 pom.xml
<dependency>
     <groupId>commons-logging</groupId>
     <artifactId>commons-logging</artifactId>
     <version>1.1.3</version>
</dependency>
<dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <version>3.8.1</version>
     <scope>test</scope>
</dependency>

mvn dependency:tree分别查看依赖情况:
[INFO] com.learn:learn2:jar:0.0.1-SNAPSHOT
[INFO] +- commons-logging:commons-logging:jar:1.1.3:compile
[INFO] \- junit:junit:jar:3.8.1:test
[INFO] ------------------------------------------------------------------------

[INFO] com.learn:learn1:jar:0.0.1-SNAPSHOT
[INFO] +- org.springframework:spring-core:jar:4.1.4.RELEASE:compile
[INFO] |  \- commons-logging:commons-logging:jar:1.2:compile
[INFO] +- com.learn:learn2:jar:0.0.1-SNAPSHOT:compile
[INFO] \- junit:junit:jar:3.8.1:test
[INFO] ------------------------------------------------------------------------

结论:
learn1模块里的spring-core依赖common-logging的1.2版本,learn1依赖learn2,并且learn2也依赖common-logging,版本号是1.1.3。那么最后learn1将会依赖commons-logging的1.2版本,对于maven中的间接依赖,哪个依赖在pom文件中定义的位置在前面,就采用在前面定义的那个依赖。spring-core定义在learn2的前面,那么此时learn1就会依赖common-logging1.2的版本,如果spring-core和learn2的顺序调换一下,就会用commons-logging1.1.3的版本。
情景二:
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <!-- 版本一 -->
    <version>2.0.6</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <!-- 版本二 -->
    <version>4.1.4.RELEASE</version>
</dependency>

分析结果:
[INFO] com.learn:learn1:jar:0.0.1-SNAPSHOT
[INFO] +- org.springframework:spring-core:jar:4.1.4.RELEASE:compile
[INFO] |  \- commons-logging:commons-logging:jar:1.2:compile

结论:
learn1将会依赖后声明的版本为4.1.4.RELEASE的spring-core依赖,一个Pom文件中声明了对一个项目的高低版本的依赖,使用最后声明者。
情景三:
learn-1依赖项目learn-2,learn-3,learn-2依赖commons-logging:1.1.3版本,learn-3依赖learn-4, learn-4依赖commons-logging:1.2版本。那么最终learn-1依赖的commons-logging版本将会是1.1.3 版本的。这是因为maven采用最短路径优先原则

情景四(optional):
learn5 pom.xml
 <dependency>
       <groupId>commons-logging</groupId>
       <artifactId>commons-logging</artifactId>
       <version>1.2</version>
       <optional>true</optional>
</dependency>

learn6 pom.xml
<dependency>
     <groupId>com.learn</groupId>
     <artifactId>learn5</artifactId>
     <version>0.0.1-SNAPSHOT</version>
</dependency>

分析结果:
[INFO] com.learn:learn6:jar:0.0.1-SNAPSHOT
[INFO] \- com.learn:learn5:jar:0.0.1-SNAPSHOT:compile

如果learn5把commons-logging的optional标签注释掉,分析的结果将不一样。
分析结果:
[INFO] 
com.learn:learn2:jar:0.0.1-SNAPSHOT
[INFO] \- com.learn:learn1:jar:0.0.1-SNAPSHOT:compile
[INFO]    \- commons-logging:commons-logging:jar:1.2:compile

结论:
optional标签如果设置为true,意味着子模块将不依赖此模块,如果想依赖这个jar,必须在自己的pom.xml文件中在声明一遍。官方文档说:这样做为了避免错误jar违反license出现问题或者classpath发生问题。
友情提示:
如果我们的项目依赖出现问题,请善用mvn dependency:tree来查看依赖情况。
在附上一个mvn插件链接http://maven.apache.org/plugins/index.html以供我们学习或者解决我们的实际问题。
1
1
分享到:
评论

相关推荐

    Maven传递依赖和依赖的规则.docx

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

    Maven 依赖详细理解.pdf

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

    maven依赖库 - maven_repository.zip

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

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

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

    MavenHelper

    7. **自定义规则**:对于企业内部的特殊依赖管理规则,MavenHelper还支持自定义配置,确保与团队的规范一致。 总之,"MavenHelper"是Java开发者处理Maven依赖冲突的理想工具。通过它,开发者可以更有效地管理项目中...

    maven仓库Windows64位

    ** 依赖管理和传递依赖 ** 在Maven的POM.xml文件中,开发者可以声明项目所需的依赖。Maven会自动解决这些依赖,并从仓库中下载它们。如果依赖之间存在版本冲突,Maven的依赖管理机制会根据优先级规则进行处理。此外...

    2024版Maven仓库清除工具

    这涉及到对Maven的依赖管理机制的理解,包括依赖范围(compile、runtime、test等)和传递性依赖。 3. **安全清除**:在确认无误后,工具将安全地删除这些未使用的依赖,释放磁盘空间。这个过程会避免误删重要的系统...

    apache-maven-3.2.2

    POM是Maven的核心概念,它定义了项目的配置、构建规则和依赖关系。通过POM,Maven可以自动下载项目所需的库文件,编译源代码,运行测试,打包应用,并部署到指定的服务器。POM中还可以定义构建过程中的各种插件和...

    apache-maven-3.6.2-bin.zip

    Maven的依赖管理不仅处理项目间的依赖,还通过传递性依赖解决了依赖树中的冲突问题。此外,Maven可以通过聚合项目(aggregation)功能管理多个模块项目,使得大型多模块项目构建变得简单。 总之,`apache-maven-...

    Maven The Complete Reference

    - **3.4.4.1 传递依赖与依赖范围**:当一个项目依赖另一个项目时,后者的所有依赖也会被传递过来,但传递依赖的范围会受到限制。 - **3.4.5 冲突解决**:Maven 有一套规则来解决依赖冲突,通常会选择最新版本的依赖...

    在Maven项目中,如何使用自己的jar包.zip

    在Maven项目中,使用自己的jar包是一个常见的需求,特别是在开发过程中...在团队开发中,尽量避免过多使用`system`作用域的依赖,因为它们不被Maven的依赖管理和传递性依赖规则所覆盖,可能导致其他开发者遇到问题。

    maven_package.zip

    Maven使用传递性依赖管理,即如果项目A依赖B,B又依赖C,Maven会自动引入C。当多个依赖包含相同JAR但版本不同时,Maven有优先级规则来解决冲突,一般采用“最近使用”原则。 7. **多模块项目**: 大型项目往往由...

    apache-maven-3.3.1

    同时,Maven还处理依赖的传递性,即如果一个依赖自身又依赖其他库,Maven会自动处理这些间接依赖。 构建过程在Maven中是标准化的,包括编译、测试、打包、验证和部署等阶段。通过简单的命令,如`mvn clean install`...

    Maven安装部署.docx

    - **依赖管理**: 在 `pom.xml` 中声明依赖,Maven 会自动处理依赖的传递性,确保所有依赖的正确引入。 5. **分模块构建** - Maven 支持多模块项目,可以在顶层 POM 中定义子模块,便于管理大型项目。 6. **Maven...

    MavenRunHelper.zip

    1. **快速定位依赖**: Maven Helper插件允许用户快速查看项目中的所有依赖关系,包括直接依赖和传递依赖。这在解决依赖冲突、查找特定库或检查项目依赖树时非常有用。用户可以通过插件直接在IDE内获取清晰的依赖图谱...

    maven jar下载顺序测试的资源

    Maven遵循“传递性依赖”原则,这意味着它不仅下载直接依赖的库,还会下载这些依赖所依赖的库,直到所有的依赖都被解决。 1. **依赖解析顺序**: Maven首先解析`pom.xml`中的直接依赖,然后按照依赖的版本管理和...

    Maven2__配置

    当多个依赖包含相同的子依赖时,Maven 使用传递性依赖原则,根据依赖树的深度优先规则来选择。此外,`&lt;dependencyManagement&gt;` 标签可以用来统一管理项目的版本。 **六、Maven 的生命周期与构建阶段** Maven 的...

    maven-3.2.5 java的jar仓库带说明ppt

    它使用传递性依赖的概念,意味着如果A依赖B,B又依赖C,那么Maven会自动将C一起引入。 ** Maven 插件 ** Maven 的功能通过插件实现,如编译、测试、打包、部署等操作都由特定的插件执行。开发者可以在 POM 文件中...

    Maven学习笔记

    POM(Project Object Model)文件是Maven的核心配置文件,它定义了项目的构建规则和依赖关系等重要信息。一个典型的POM文件包括以下关键元素: 1. **`&lt;modelVersion&gt;`**:通常为`4.0.0`,表示POM文件遵循的格式版本。...

Global site tag (gtag.js) - Google Analytics