`

Maven的依赖管理(Dependency Management)

阅读更多

Maven的亮点之一就是依赖管理,其介绍依赖管理的产品文档竟然长达15页之多,可能这个概念的复杂度不是很小,值得关注,值得学习。

以下是一个POM中典型的一段关于依赖的片段:

<!--Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/-->
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.0</version>
      <type>jar</type>
      <scope>test</scope>
      <optional>true</optional>
    </dependency>
    ...
  </dependencies>
  ...
</project>

  

 
1、Transitive Dependency (传递依赖)

    你的项目依赖于A,A又依赖于B。你的项目是否要声明你依赖于B? Maven的回答是它帮你自动管理这种依赖的传递,你不需要声明你依赖于B,由Maven来做。

    不难就会想到一种冲突的情况,如A -> B -> C -> D 2.0,同时存在A -> E -> D 1.0,那么应该使用D1.0还是D2.0呢?用Maven的话来说,这件事情叫做“Dependency Mediation”(依赖仲裁),当出现这种冲突时,采用“Nearest Definition”的解决办法,即采用最短路径,在上述例子中仲裁的结果是D1.0,因为它的路径更短。如果两个路径长短是一样的呢?那么只能是谁先出现就选谁了。上述例子中如果你显式声明A依赖于D2.0,那么Maven就会帮你选取D2.0而不是D1.0。

 

2、Dependency Scope (依赖范围)

    举例来说,你开发时需要做测试,你需要依赖于junit的jar,但是部署应用时并不需要它,因为单元测试不会在生产环境上跑,也就是说最终打包的jar或者war不包含junit的jar。又如你开发web程序,你的servlet/jsp进行编译需要依赖于servlet-jsp的标准api(J2EE的jar),但是部署时也是不需要它的,因为你的应用服务器肯定有这些东西。

    因此,Maven考虑了6中可能的scope供选择:

    - compile: 默认的scope。编译、测试、打包全都需要。compile参与依赖传递,就是说,你的项目A依赖于B(依赖scope是compile),项目C依赖于你的项目A,那么C也就依赖于B。

    - provided: 表示JDK或者容器会在Runtime时提供这些(jar),如上面说到的servlet api。provided的东西在编译和测试时会用到,不参与传递依赖。

    - runtime: 表示编译时不需要,但测试和运行时需要,最终打包时会包含进去。

    - test: 只用于测试阶段(测试的编译和测试的运行),典型的就是junit的jar。

    - system: 和provided类似,但要求jar是你的系统里已有的,不会在repository里找,如rt.jar,tools.jar这些。

    - import: 简单的说,你的项目的pom可以继承另一个项目的pom,从而继承了父项目的依赖关系,但是因为之后single inheritance的限制,所以创造了import,使得你可以“导入”或者说“继承”任何一到多个项目的依赖关系。

    如果你要考虑更细一些,你的项目依赖于A(scope1),A依赖于B(scope2),那么你的项目对B的依赖应该算是哪个scope呢?官方文档上有个表格,列举了scope1和scope2的一个矩阵关系(各自都可能是compile/provided/runtime/test),然后最后结果应该是什么。

 

3、Dependency Classier

    用于再次区分不同类别的东西,如在jdk1.4下编译的东西还是jdk1.5下出来的云云。

分享到:
评论

相关推荐

    Maven dependencies与dependencyManagement的区别详解

    今天,我们将详细介绍 Maven 依赖管理机制中的两个重要概念:dependencies 和 dependencyManagement。 dependencies dependencies 是 Maven 项目中最基本的依赖管理机制。它定义了项目中需要的依赖项,包括 jar 包...

    Maven 实战问题和最佳实践.pdf

    dependencyManagement 是表⽰依赖 jar 包的声明,即你在项⽬中的 dependencyManagement 下声明了依赖,maven 不会加 载该依赖,dependencyManagement 声明可以被继承。 dependencyManagement 的⼀个使⽤案例是当有⽗...

    Maven的Dependency测试

    当多个依赖有相同的`groupId`和`artifactId`但不同版本时,Maven会根据`dependencyManagement`来解决冲突。 4. **测试框架集成** Maven支持与JUnit、TestNG等测试框架集成,通过`maven-surefire-plugin`插件运行...

    maven 中引入依赖的包

    如果无法解决冲突,可以使用`dependencyManagement`标签来统一管理所有模块的依赖版本。 总的来说,Maven的依赖管理是其强大功能的一部分,它极大地简化了Java项目的构建流程,让开发者能够更专注于代码编写,而...

    dependencyManagement与dependencies区别.docx

    在Maven项目中,`dependencyManagement`和`dependencies`元素都是用来管理项目依赖的重要部分,但它们的作用方式有所不同。理解这两个元素的区别对于构建稳定、可维护的多模块项目至关重要。 一、dependency...

    dependency-management-plugin:一个Gradle插件,提供类似Maven的依赖项管理功能

    依赖管理插件 ... 要了解有关使用Dependency Management插件的更多信息,请参阅其。 贡献 该项目的贡献者同意遵守其。 是受欢迎的。 有关详细信息,请参见。 执照 依赖性管理插件是在下发行的开源软件。

    maven依赖的压缩包

    5. **解决依赖问题**:如果遇到依赖冲突,Maven遵循“最接近原则”(nearest wins)进行解决,但也可以通过调整POM中的dependencyManagement来全局控制依赖版本。 6. **使用Maven仓库**:除了中央仓库外,还可以...

    maven-dependency-analyzer:Apache Maven依赖性分析器

    这样,您可以确保您不会浪费时间在Apache Maven范围之外的东西上。 假设您的问题不存在,请提交该问题的票证。 清楚地描述问题,包括在出现错误时重现的步骤。 确保填写您知道存在问题的最早版本。 在GitHub上...

    maven项目管理工具

    3. **依赖管理(Dependency Management)**: Maven通过POM文件管理项目的依赖关系,自动下载所需的库文件,避免了类路径冲突问题。只需在POM文件中声明依赖,Maven会自动处理。 4. **仓库(Repository)**: Maven...

    20220609-maven依赖

    标题 "20220609-maven依赖" 暗示了这是一个关于Maven项目构建和依赖管理的主题。Maven是Java开发中的一个关键工具,它通过使用一种标准化的方式来管理和构建项目,使得依赖库的下载、编译、打包和部署变得简单。在这...

    idea插件一键解决maven依赖冲突

    本插件参考58开源插件MavenManager,采用dependencyManagement方式,一键解决Java开发过程中使用maven作为依赖管理时的jar包依赖冲突问题,相比MavenHelper更加省时省力,jar包版本采用最新版本号原则

    简单的maven父子依赖的sample

    在Java开发领域,Maven是一个广泛使用的项目管理和综合工具,它通过XML格式的配置文件管理项目的构建、报告和依赖关系。本示例“简单的maven父子依赖的sample”旨在介绍如何在Maven项目中设置父子模块间的依赖关系,...

    gradle-dma-plugin:一个Gradle插件,提供类似于Maven的依赖项管理功能

    然而,Maven使用的是`pom.xml`中的`dependencyManagement`部分来统一管理项目中所有模块的依赖版本。 ### 二、Gradle DMA Plugin的核心功能 1. **统一依赖版本**:通过配置,DMA插件可以让Gradle项目像Maven一样,...

    maven项目pom.xml中parent标签的使用.docx

    "Maven 项目 pom.xml 中 parent 标签的使用" ...Maven 项目 pom.xml 文件中的 parent 标签和 `&lt;dependencyManagement&gt;` 标签是依赖管理的核心组件,它们可以简化项目间的依赖管理,使得项目结构更加清晰、易于维护。

    Maven 多项目依赖关系

    2. **继承依赖**:父`pom.xml`可以使用`&lt;dependencyManagement&gt;`标签来管理所有子模块的依赖,这样在子模块中只需声明artifactId,无需指定完整版本信息。这有助于保持项目一致性,避免因版本冲突引发的问题。 3. *...

    使用Maven管理进行多模块开发

    通过父模块的`dependencyManagement`部分,可以集中定义所有依赖的版本,避免版本冲突。子模块只需声明依赖,而无需指定版本。 六、构建与编译 使用Maven,可以方便地进行项目的构建和编译。运行`mvn clean install...

    maven3.2.5安装包下载

    Maven包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System)。 安装步骤 先下载,下载完成后,解压到某个目录  ...

    maven-dependencies.rar

    《 Maven依赖管理详解与资源包应用指南》 在软件开发过程中,依赖管理是至关重要的一个环节,尤其是在Java世界中,Maven作为主流的构建工具,它的依赖管理功能为开发者提供了极大的便利。本资源包"maven-...

Global site tag (gtag.js) - Google Analytics