maven - dependencies与dependencyManagement的区别

2023-05-16

1、DepencyManagement应用场景
当我们的项目模块很多的时候,我们使用Maven管理项目非常方便,帮助我们管理构建、文档、报告、依赖、scms、发布、分发的方法。可以方便的编译代码、进行依赖管理、管理二进制库等等。
由于我们的模块很多,所以我们又抽象了一层,抽出一个父级项目来管理子项目的公共的依赖。为了项目的正确运行,必须让所有的子项目使用依赖项的统一版本,必须确保应用的各个项目的依赖项和版本一致,才能保证测试的和发布的是相同的结果。
在我们项目顶层的POM文件中,我们会看到dependencyManagement元素。通过它元素来管理jar包的版本,让子项目中引用一个依赖而不用显示的列出版本号。Maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用在这个dependencyManagement元素中指定的版本号。

来看看实际的例子:

现在我们有两个项目:task-parent、task-assemble

task-parent(pom.xml)


 1 <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">
 2   <modelVersion>4.0.0</modelVersion>
 3   <groupId>com.sup.task</groupId>
 4   <artifactId>task-parent</artifactId>
 5   <version>0.0.1-SNAPSHOT</version>
 6   <packaging>pom</packaging>
 7   <name>task-parent</name>
 8   
 9   <!-- 定义公共变量 -->
10   <properties>  
11       <!-- junit版本号 -->  
12       <junit.version>4.11</junit.version>
13   </properties>
14   
15   <dependencyManagement>
16         <dependencies>
17             <dependency>
18                 <groupId>junit</groupId>
19                 <artifactId>junit</artifactId>
20                 <version>${junit.version}</version>
21             </dependency>
22         </dependencies>
23   </dependencyManagement>
24 </project>  

task-assemble(pom.xml)


 1 <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">
 2   <modelVersion>4.0.0</modelVersion>
 3   <!--继承父类-->
 4   <parent>
 5     <artifactId>task-parent</artifactId>
 6     <groupId>com.sup.task</groupId>
 7     <version>0.0.1-SNAPSHOT</version>
 8   </parent>
 9   <groupId>com.sup.task</groupId>
10   <artifactId>task-assemble</artifactId>
11   <version>0.0.1-SNAPSHOT</version>
12   <packaging>war</packaging>
13   <name>task-assemble</name>
14   
15     <dependencies>
16         <dependency>
17             <groupId>junit</groupId>
18             <artifactId>junit</artifactId>
19         </dependency>
20   </dependencies>
21 </project>  

这样做的好处:统一管理项目的版本号,确保应用的各个项目的依赖和版本一致,才能保证测试的和发布的是相同的成果,因此,在顶层pom中定义共同的依赖关系。同时可以避免在每个使用的子项目中都声明一个版本号,这样想升级或者切换到另一个版本时,只需要在父类容器里更新,不需要任何一个子项目的修改;如果某个子项目需要另外一个版本号时,只需要在dependencies中声明一个版本号即可。子类就会使用子类声明的版本号,不继承于父类版本号。

2、Dependencies
相对于dependencyManagement,所有生命在dependencies里的依赖都会自动引入,并默认被所有的子项目继承。

3、区别
dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)
dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。

4、Maven约定优于配置
它提出这一概念,为项目提供合理的默认行为,无需不必要的配置。提供了默认的目录


src ——> 源代码和测试代码的根目录
    main 应用代码的源目录
        java 源代码
        resources 项目的资源文件
    test 测试代码的源目录
        java 测试代码
        resources 测试的资源文件
target 编译后的类文件、jar文件等

对于Maven约定优于配置的理解,一方面对于小型项目基本满足我们的需要基本不需要自己配置东西,使用Maven已经配置好的,快速上手,学习成本降低;另一方面,对于不满足我们需要的还可以自定义设置,体现了灵活性。配置大量减少了,随着项目变的越复杂,这种优势就越明显。

 

转载地址:http://blog.csdn.net/liutengteng130/article/details/46991829

转载于:https://www.cnblogs.com/chenfeng1122/p/6134034.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

maven - dependencies与dependencyManagement的区别 的相关文章

随机推荐

  • Android读写properties配置文件

    写这篇文章之前可以成功运行 文章后就各种找不到文件 所以并没有采用此种方式 后期完善 详见下篇解决方案 配置文件读取很容易 修改需要注意权限 比如assets目录下就不允许修改 配置文件的创建 New File 命名后选择propertie
  • el-select数据过多懒加载(loadmore)

    el select数据过多处理方式 在日常项目中el select组件的使用频率是非常之高的 当数据过多时渲染时间非常长 这里提供几个处理方式 远程搜索 组件提供了远程搜索方式 也就是按照你输入的结果匹配选项 官网提供了参考示例 这里不加赘
  • Node连接Mysql遇到的坑以及踩坑总结

    前段时间做的项目中 xff0c 要用到 express 43 mysql 先看看我最初的实现代码 xff1a var conn 61 mysql createConnection host 39 example org 39 user 39
  • Cisco交换机配置新手篇之端口配置

    上回跟大家介绍了 如何正确连接交换机 xff0c 今天用一些配置片段给大家介绍一下端口的配置 鉴于网上大多数配置事例都是show run出来的结果 不利于新手对命令配置过程的了解 xff0c 所以笔者将配置片段和注意的地方都注明了一下 xf
  • 批处理:FOR的参数/F之delims详解

    xff08 三 xff09 delims 61 符号集 分隔符 格式 xff1a FOR F 34 Delims 61 符号集 34 I IN Command1 DO Command2 用法 xff1a 一句话总结 xff1a 忽略分隔符
  • springboot 单元测试 指定启动类

    问题 在做单元测试时 xff0c 写了一个工具类 xff0c 用于注入spring的上下文 public class AppBeanUtil implements ApplicationContextAware private static
  • 多项式系数提取算法 c++

    bool isNumber char s if s gt 61 48 amp amp s lt 61 57 return true else return false bool isLetter char s if s gt 61 97 a
  • matlab练习程序(透视变换)

    close all clc H 61 1 索引pix中第一个元素 xff0c 即高度 W 61 2 索引pix中第二个元素 xff0c 即宽度 left right 61 0 3 抬起左边或右边时值为0 1 之间 xff0c 不抬起时为0
  • 【Java】SHA加密

    package sdfg import java math BigInteger import java security MessageDigest import java security NoSuchAlgorithmExceptio
  • 改变虚拟导航栏(navigation bar)背景色及图标颜色

    众所周知 xff0c 安卓系统中存在着虚拟导航栏 xff0c 它们不是实体按键 xff0c 而是通过软件实现的 一般而言 xff0c 虚拟导航栏是长成下面这样的 xff1a 系统中默认的虚拟导航栏的背景色是黑色 xff0c 按键的颜色是白色
  • java 去掉 if else_Java 通过注解消除if else

    半夜睡醒出门吃宵夜回家锁坏了 被逼无奈去了网吧正好想起之前构思的消除ifelse的方案正好就试了试 经过几小时奋斗修修改改终于实现了效果 特此分享 具体的流程如上 大概的场景是 在 web项目中有很多方法是要携带token或其他的操作才可以
  • linux上传文件的命令

    由于svm挂机不能通过svn提交代码 xff0c 所以今天尝试了一下linux的rz和sz命令 1 sz命令是把文件下载到本地 xff0c 使用方法如下 sz 文件名 回车之后会弹出一个本地的路径选择框 xff0c 选择要下载的路径即可 2
  • Python自动化备份系统及网站

    随着目前IT迅猛的发展 xff0c 自动化运维对于Linux运维人员也越来越重要 xff0c 传统的运维方式靠大量的人力 xff0c 现在也逐渐转向自动化运维 xff0c 我们常见的跟自动化有关的软件有哪些呢 今天我们来简单列举一下 xff
  • iOS中 项目开发易错知识点总结 韩俊强的博客

    每日更新关注 http weibo com hanjunqiang 新浪微博 xff01 点击return取消textView 的响应者 BOOL textFieldShouldReturn UITextField textField co
  • VNC常用操作及常见问题解决办法汇总

    VNC登录用户缺省是root xff0c 但在安装oracle时必须用oracle用户的身份登录 xff0c 下面我们就以oracle为例说明如何配置VNC xff0c 从而可以使用不同的用户登录到主机 步骤描述如下 xff1a 步骤一 x
  • Debian隐藏桌面图标

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 运行gconf editor xff0c 找到apps nautilus desktop 然后将所要隐藏的图表的visible勾掉就可以了 转载于 https my osc
  • 第四次作业:Windows各种基本应用的命令处理方法

    删除文件夹命令 xff1f rd remove directory 如何给文件夹重新命名 xff1f ren rename 如何在文件夹中建立文件夹 xff1f md swift a 如何用命令查看文本文件的内容 xff1f type sw
  • Nginx访问ftp目录时权限问题

    在将nginx目录设置为ftp目录访问时会报错 xff1a 403 forbidden 这是权限问题 xff0c 解决方法是在配置文件中增加User vi usr local nginx conf nginx conf 增加user可以是r
  • SpringBoot-@PathVariable

    URL变量 在上一个博客中 xff0c 学习了如何在 64 Controller中创建 64 RequestMapping xff08 或者响应的简写 xff09 来处理不同的URL请求 但是在Web应用中URL通常不是一成不变的 xff0
  • maven - dependencies与dependencyManagement的区别

    1 DepencyManagement应用场景 当我们的项目模块很多的时候 xff0c 我们使用Maven管理项目非常方便 xff0c 帮助我们管理构建 文档 报告 依赖 scms 发布 分发的方法 可以方便的编译代码 进行依赖管理 管理二