Maven实战(六)--- dependencies与dependencyManagement的区别

2023-05-16

         在上一个项目中遇到一些jar包冲突的问题,之后还有很多人分不清楚dependenciesdependencyManagement的区别,本篇文章将这些区别总结下来。

 

1DepencyManagement应用场景

         当我们的项目模块很多的时候,我们使用Maven管理项目非常方便,帮助我们管理构建、文档、报告、依赖、scms、发布、分发的方法。可以方便的编译代码、进行依赖管理、管理二进制库等等。

         由于我们的模块很多,所以我们又抽象了一层,抽出一个itoo-base-parent来管理子项目的公共的依赖。为了项目的正确运行,必须让所有的子项目使用依赖项的统一版本,必须确保应用的各个项目的依赖项和版本一致,才能保证测试的和发布的是相同的结果。

        在我们项目顶层的POM文件中,我们会看到dependencyManagement元素。通过它元素来管理jar包的版本,让子项目中引用一个依赖而不用显示的列出版本号。Maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用在这个dependencyManagement元素中指定的版本号。

 

来看看我们项目中的应用:

                                                                                              pom继承关系图:


                                                                     依赖关系:

Itoo-base-parent(pom.xml)

<dependencyManagement>
		
		<dependencies>
			<dependency>
				<groupId>org.eclipse.persistence</groupId>
				<artifactId>org.eclipse.persistence.jpa</artifactId>
				<version>${org.eclipse.persistence.jpa.version}</version>
				<scope>provided</scope>
			</dependency>
			
			<dependency>
				<groupId>javax</groupId>
				<artifactId>javaee-api</artifactId>
				<version>${javaee-api.version}</version>
			</dependency>
		</dependencies>
	</dependencyManagement>

Itoo-base(pom.xml)

<!--继承父类-->
<parent>
		<artifactId>itoo-base-parent</artifactId>
		<groupId>com.tgb</groupId>

		<version>0.0.1-SNAPSHOT</version>
		<relativePath>../itoo-base-parent/pom.xml</relativePath>
	</parent>
		<modelVersion>4.0.0</modelVersion>
		<artifactId>itoo-base</artifactId>
		<packaging>ejb</packaging>
		
		<!--依赖关系-->
		<dependencies>
		<dependency>
			<groupId>javax</groupId>
			<artifactId>javaee-api</artifactId>
		</dependency>
		
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-annotations</artifactId>
		</dependency>
		
		<dependency>
			<groupId>org.eclipse.persistence</groupId>
			<artifactId>org.eclipse.persistence.jpa</artifactId>
			<scope>provided</scope>
		</dependency>
	</dependencies>
</project>

 

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

 

2Dependencies

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

 

3、区别

           dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)

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

 

4Maven约定优于配置

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

 

 

src                   ——>         源代码和测试代码的根目录

main                            应用代码的源目录

java                     源代码

resources           项目的资源文件

test                               测试代码的源目录

java                      测试代码

resources            测试的资源文件

target                                   编译后的类文件、jar文件等

 

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

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

Maven实战(六)--- dependencies与dependencyManagement的区别 的相关文章

  • 以编程方式启动 OSGi (Equinox)?

    我希望能够轻松启动 OSGi 框架 最好是 Equinox 并从 java main 加载我的 pom 中列出的任何包 这可能吗 如果是这样 怎么办 似乎 pax 工具可以做到这一点 但我似乎找不到任何表明这一点的文档 我知道我可以像这样启
  • 如何强制maven更新本地repo

    我在一个项目中编译了一个 jar 文件 以便可以在第二个项目中使用它 我可以在 m2 文件夹中看到 jar 文件 但在第二个项目中 它抱怨找不到工件 我想我必须强制 Maven 更新索引 缓存一些东西 但不知道到底是什么 任何提示 谢谢 更
  • spring 3.0 包含哪些 Maven 依赖项?

    我正在尝试使用 Spring 3 0 和 Maven 做我的第一个项目 我已经在很多项目中使用了 Spring 2 5 和初级版本 不过 我有点困惑 我必须在 pom xml 中将哪些模块定义为依赖项 我只想使用核心容器功能 beans c
  • Gradle:找不到提供的方法()(组)

    为什么Gradle找不到方法provided当这是语法时指定的 https mvnrepository com artifact javax javaee api 7 0通过马文 thufir doge NetBeansProjects g
  • 测试前设置TestNG的输出目录

    我正在使用 Eclipse 运行一些 TestNG 测试 使用 XML 文件 右键单击 作为 TestNG 套件运行 我仅将 Maven 用于依赖项 而不用于运行测试 有没有办法在代码中设置输出目录 例如 System out printl
  • Maven 通常不会解析传递依赖项的版本号 - “${project.version}”

    我已经被这个问题困扰了一段时间 无法弄清楚问题可能是什么 它是间歇性的 这就是为什么我在这里和那里花了半个小时来尝试解决它 但最终放弃 直到我厌倦了再次尝试 现在我已经厌倦了来这里哭泣 由于某种原因 我的 Maven 安装 设置似乎经常无法
  • Eclipse Juno 中的生命周期配置错误未涵盖插件执行

    为什么我的 Maven 构建在命令行上工作得很好 但是当我在 Eclipse 中运行时 它需要我将此部分添加到我的 pom xml 中 否则我会收到此错误 Plugin execution not covered by lifecycle
  • Maven安装错误找不到javax.el.E​​LContext和找不到javax.el.E​​LResolver

    我正在使用 Maven 3 和 JDK 1 7 当我尝试做的时候mvn install 我收到以下错误 ERROR domain view EmployeeNameConverter java 29 76 cannot access jav
  • 覆盖 Ivy 依赖项的修订版

    我使用 Apache Ivy 来处理库依赖性 在我的公司 我们有一个定期发布 版本控制的 核心 项目 然后 我们有许多针对特定客户的 客户 项目 每个客户项目都使用我们在客户项目的 ivy xml 中维护的核心项目的特定版本 一切都很好 有
  • 如何在 Gradle 构建脚本中使用 java 库?

    我需要在 Gradle 脚本中使用 Apache Commons 那么我需要在哪里添加依赖项以使其可用 我的 Android 项目中不需要它 但只在 gradle 脚本中需要 您需要添加依赖项buildscript部分如下 buildscr
  • 使用 testng 和 maven 运行不同的测试套件

    我使用 TestNg 和 Maven 以及 Surefire 插件来运行我的测试 我有几个不同的组件 我希望能够使用相同的 pom xml 在不同时间运行它们 目前 为了做到这一点 我有几个不同的 XML 文件定义了一个测试套件 并且我设置
  • $exceptionHandler 中的 $location - 依赖冲突

    我正在尝试实现一个非常标准的任务 当发生异常时 重定向到我的 error page 代码的简化形式如下所示 app factory exceptionHandler location function location return fun
  • 多模块项目的 Maven 阶段顺序?

    对不起 我是 Maven 的菜鸟 这是我的maven项目目录 project pom xml moduleA moduleB sub moduleA sub moduleB sub moduleC moduleC 当然 每个模块和子模块内都
  • Maven 配置文件激活条件中 os.family 的值

    Maven 允许根据其运行的操作系统系列激活某些构建配置文件 例如
  • 如何默认将 Maven 插件附加到阶段?

    我有一个 Maven 插件应该在编译阶段运行 所以在项目中consumes我的插件 我必须做这样的事情
  • 如何在发布期间复制未版本化的测试资源:执行?

    我的问题与 Maven 在发布时不会复制未跟踪的资源 https stackoverflow com questions 10378708 maven doesnt copy untracked resources while releas
  • npm 如何处理循环依赖?

    只是想知道 如果有一个具有循环 循环依赖的包 npm 会处理它吗 如何 我用谷歌搜索但找不到非常有用的结果 我在这里可以想到两种问题 相同版本的循环依赖 A gt B B gt C C gt A npm 是否像这样构建依赖关系 只是我的猜测
  • 依赖管理中的依赖项与 Maven 版本插件中的依赖项

    当我使用 Maven 时versions display dependency updates为了检查依赖项更新 我得到了两部分结果 1st 依赖管理中的以下依赖项具有较新的 版本 2nd 依赖项中的以下依赖项具有较新的版本 这两者有什么区
  • 使用 Maven 将值附加到文件中

    我想在文件末尾附加一个值 但我无法确定要使用哪个插件 例子 我要附加的值 myValue file value1 value2 myValue 追加后 我知道我可以使用 antrun plugin 来做到这一点 但是可以使用 Maven 插
  • 将带有 webapp 的 WAR 部署到 Maven 中央存储库是否有意义?

    这样做有意义吗 如果是 我在哪里可以找到使用简单的 Web Hello World 执行此操作的示例 当人们从 Maven 执行 Web 应用程序时 他们会使用 Jetty 来运行它吗 我想 tomcat 太重了 任何帮助将不胜感激 谢谢

随机推荐

  • mybatis plus or and 合并写法

    int count 61 hrDeliverEmployContractService selectCount new EntityWrapper lt HrDeliverEmployContractEntity gt eq 34 pool
  • 设计模式(大大提高代码可维护性以及复用性)(持续更新)

    单例 xff08 Singleton xff09 模式 xff1a 某个类只能生成一个实例 xff0c 该类提供了一个全局访问点供外部获取该实例 xff0c 其拓展是有限多例模式 原型 xff08 Prototype xff09 模式 xf
  • 并发量、QPS 和TPS区别

    并发量 xff1a 系统同时处理的request 事务数 可以理解为 xff1a 系统同时处理的request数量 TPS xff1a 每秒处理的查询量 每秒钟request 事务 数量 可以理解为 xff1a 每秒处理的request 数
  • mysql-plus 字段验证策略fieldStrategy

    ignored 不管有没有有设置属性 xff0c 所有的字段都会设置到insert语句中 xff0c 如果没设置值 xff0c 全为null xff0c 这种在update 操作中会有风险 xff0c 把有值的更新为null not nul
  • Navicat 12 for MySQL最新版激活(注册机)

    整个过程在断网环境下 安装包也用刚下载的 转 https blog csdn net zhangli0910 article details 83785147 最新版注册机 43 Navicat下载 xff1a 链接 xff1a https
  • C_INCLUDES must be under the source or output directories

    Android项目N版本切到O版本 xff0c 同一个模块去mm xff0c 报C INCLUDES must be under the source or output directories错误 后来才找到原因 xff0c 是因为该模块
  • “MobaXterm X11 proxy: Unsupported authorisation protocol”解决方法

    服务器无法显示GUI图片问题 在解决这个问题的时候 xff0c 可能很多人都搜到了用sudo的方法 xff0c 但是在我们没有管理权限的情况下 xff0c 这个问题也是能解决的 报错信息 我的报错信息 xff1a MobaXterm X11
  • Linux 并发与竞争

    Linux是一个多任务操作系统 xff0c 肯定会存在多个任务共同操作同一段内存或者设备的情况 xff0c 多个任务甚至中断都能访问的资源叫做共享资源 xff0c 就和共享单车一样 在驱动开发中要注意对 共享资源的保护 xff0c 也就是要
  • linux man手册和设置中文版man手册

    http man he net linux 设置中文版man手册
  • win10宽带连接断网自动重连

    文章目录 1 断开网络连接 xff0c 重命名网络连接2 bat代码 xff1a 检测到断线自动重连3 设置开机自动执行3 1 方式一 xff1a 任务计划程序3 2 方式二 xff1a 用vbs代码开机运行bat 1 断开网络连接 xff
  • ubuntu20环境下使用DevStack安装Openstack-Wallaby(单节点、多节点)

    文章目录 一 单节点部署1 环境准备1 1 镜像源1 2 pip源1 3 安装依赖包 2 OpenStack安装 wallaby2 1 添加 96 stack 96 用户2 2 设置代理2 3 下载devstack xff0c 使用 96
  • 【操作系统】页面置换算法

    页面置换算法 在进程运行过程中 xff0c 若需要访问的物理块不在内存中 xff0c 就需要通过一定的方式来将页面载入内存 xff0c 而此时内存很可能已无空闲空间 xff0c 因此就需要一定的算法来选择内存中要被置换的页面 xff0c 这
  • 前端 好看实用的颜色大全(16进制)

  • 解决linux写入ntfs盘时报错:只读文件系统

    2018 10 28 更新 可能因为在挂载wimdows盘后 xff0c 强制关机造成的 xff0c 可使用 sudo ntfsfix dev 来修复 其中 xff0c 为具体哪个盘 xff0c 例如sudo ntfsfix dev sda
  • 【计算机网络】TCP IP通信处理过程

    1 数据包首部 每个分层中都会对所发送的数据附加一个首部 xff0c 其中包含了该层必要的信息 xff0c 如发送端地址 接收端地址以及协议等相关信息 2 发送数据包 1 xff09 应用程序处理 进行编码处理 xff08 相当于表示层功能
  • 【高性能定时器】 时间轮

    时间轮 简述 顾名思义 xff0c 时间轮就像一个轮子 xff0c 在转动的时候外界会指向轮子不同的区域 xff0c 该区域就可以被使用 因此只要将不同时间的定时器按照一定的方法散列到时间轮的不同槽 xff08 即时间轮划分的区域 xff0
  • 系统调用中断(EINTR)与SIGCHLD信号的处理

    一 被中断的系统调用 EINTR 的理解 1 慢系统调用是 xff1f 2 慢系统调用的类别3 EINTR产生的原因5 一般处理方法 二 SIGCHLD信号的处理 1 SIGCHLD信号的产生2 SIGCHLD信号的处理3 不处理SIGCH
  • 定时器与超时的设置

    一 相关时间函数 1 gettimeofday 2 time 3 clock 二 间隔定时器 1 setitimerval 2 getitimerval 3 实时定时器的使用 三 为阻塞操作设置超时 1 alarm 2 给read 设置读超
  • 解决tomcat启动时,端口被占用问题

    有时候我们启动tomcat的时候 xff0c 会提示端口被占用 xff0c 我们可以用下面的方法解决这个问题 1 进入cmd 2 输入netstat ano findstr 8080 xff08 注 xff1a 8080为被占用的端口名 x
  • Maven实战(六)--- dependencies与dependencyManagement的区别

    在上一个项目中遇到一些 jar 包冲突的问题 xff0c 之后还有很多人分不清楚 dependencies 与 dependencyManagement 的区别 xff0c 本篇文章将这些区别总结下来 1 DepencyManagement