Maven 6、maven中的工程关系

2023-11-02

maven中的工程关系

Maven工具基于POM(Project Object Model,项目对象模型)模式实现的。在Maven中每个项目都相当于是一个对象,对象(项目)和对象(项目)之间是有关系的。关系包含了:依赖、继承、聚合,实现Maven项目可以更加方便的实现导jar包、拆分项目等效果。

依赖

【1】依赖关系:
即A工程开发或运行过程中需要B工程提供支持,则代表A工程依赖B工程。

在这种情况下,需要在A项目的pom.xml文件中增加下属配置定义依赖关系。

在这里插入图片描述

通俗理解:就是导jar包。

B工程可以是自己的项目打包后的jar包,也可以是中央仓库的jar包。

【2】如何注入依赖呢?

在pom.xml文件 根元素project下的 dependencies标签中,配置依赖信息,内可以包含多个 dependence元素,以声明多个依赖。每个依赖dependence标签都应该包含以下元素:groupId, artifactId, version : 依赖的基本坐标, 对于任何一个依赖来说,基本坐标是最重要的, Maven根据坐标才能找到需要的依赖。

在这里插入图片描述

【3】依赖的好处:

省去了程序员手动添加jar包的操作,省事!!

可以帮我们解决jar包冲突问题:
在这里插入图片描述

传递性依赖

传递性依赖是Maven2.0的新特性。假设你的项目依赖于一个库,而这个库又依赖于其他库。你不必自己去找出所有这些依赖,你只需要加上你直接依赖的库,Maven会隐式的把这些库间接依赖的库也加入到你的项目中。这个特性是靠解析从远程仓库中获取的依赖库的项目文件实现的。一般的,这些项目的所有依赖都会加入到项目中,或者从父项目继承,或者通过传递性依赖。

如果A依赖了B,那么C依赖A时会自动把A和B都导入进来。
在这里插入图片描述创建A项目后,选择IDEA最右侧Maven面板lifecycle,双击install后就会把项目安装到本地仓库中,其他项目就可以通过坐标引用此项目。

案例:

项目1:MavenDemo项目依赖了Mybatis的内容:

在这里插入图片描述注意:请将项目1打包为jar包—》重新打包

再创建项目2:让项目2依赖项目1:
在这里插入图片描述从上面可以证明:项目2依赖项目1,项目1依赖Mybatis工程,–》传递性—》项目2可以直接使用Mybatis工程

依赖的两个原则

【1】第一原则:最短路径优先原则
“最短路径优先”意味着项目依赖关系树中路径最短的版本会被使用。

例如,假设A、B、C之间的依赖关系是A->B->C->D(2.0) 和A->E->(D1.0),那么D(1.0)会被使用,因为A通过E到D的路径更短。

【2】第二原则:最先声明原则

依赖路径长度是一样的的时候,第一原则不能解决所有问题,比如这样的依赖关系:A–>B–>Y(1.0),A–>C–>Y(2.0),Y(1.0)和Y(2.0)的依赖路径长度是一样的,都为2。那么到底谁会被解析使用呢?在maven2.0.8及之前的版本中,这是不确定的,但是maven2.0.9开始,为了尽可能避免构建的不确定性,maven定义了依赖调解的第二原则:第一声明者优先。在依赖路径长度相等的前提下,在POM中依赖声明的顺序决定了谁会被解析使用。顺序最靠前的那个依赖优胜。

排除依赖

exclusions: 用来排除传递性依赖 其中可配置多个exclusion标签,每个exclusion标签里面对应的有groupId, artifactId, version三项基本元素。注意:不用写版本号。

比如:A—>B—>C (Mybatis.jar) 排除C中的Mybatis.jar
在这里插入图片描述

依赖范围

依赖范围就决定了你依赖的坐标 在什么情况下有效,什么情况下无效:
❀compile
这是默认范围。如果没有指定,就会使用该依赖范围。表示该依赖在编译和运行时都生效。
在这里插入图片描述

❀provided
已提供依赖范围。使用此依赖范围的Maven依赖。典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行项目的时候,由于容器已经提供,就不需要Maven重复地引入一遍(如:servlet-api)

❀runtime
runtime范围表明编译时不需要生效,而只在运行时生效。典型的例子是JDBC驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。

❀system
系统范围与provided类似,不过你必须显式指定一个本地系统路径的JAR,此类依赖应该一直有效,Maven也不会去仓库中寻找它。但是,使用system范围依赖时必须通过systemPath元素显式地指定依赖文件的路径。

❀test
test范围表明使用此依赖范围的依赖,只在编译测试代码和运行测试的时候需要,应用的正常运行不需要此类依赖。典型的例子就是JUnit,它只有在编译测试代码及运行测试的时候才需要。Junit的jar包就在测试阶段用就行了,你导出项目的时候没有必要把junit的东西到处去了就,所在在junit坐标下加入scope-test

❀Import
import范围只适用于pom文件中的部分。表明指定的POM必须使用部分的依赖。
注意:import只能用在dependencyManagement的scope里。

定义一个父工程–》POM工程:
在这里插入图片描述

注意:工程1要打成自己的jar包

定义一个子工程:

在这里插入图片描述

如果父工程中加入score-import 相当于强制的指定了版本号:

在这里插入图片描述

继承关系

【1】继承关系:
如果A工程继承B工程,则代表A工程默认依赖B工程依赖的所有资源,且可以应用B工程中定义的所有资源信息。

被继承的工程(B工程)只能是POM工程。

注意:在父项目中放在<dependencyManagement>中的内容时不被子项目继承,不可以直接使用

放在<dependencyManagement>中的内容主要目的是进行版本管理。里面的内容在子项目中依赖时坐标只需要填写

和即可。(注意:如果子项目不希望使用父项目的版本,可以明确配置version)。

父工程是一个POM工程:

在这里插入图片描述

创建子工程:

在这里插入图片描述

本质上:POM文件的继承

聚合

当我们开发的工程拥有2个以上模块的时候,每个模块都是一个独立的功能集合。比如某大学系统中拥有搜索平台,学习平台,考试平台等。开发的时候每个平台都可以独立编译,测试,运行。这个时候我们就需要一个聚合工程。

在创建聚合工程的过程中,总的工程必须是一个POM工程(Maven Project)(聚合项目必须是一个pom类型的项目,jar项目war项目是没有办法做聚合工程的),各子模块可以是任意类型模块(Maven Module)。

前提:继承。

聚合包含了继承的特性。

聚合时多个项目的本质还是一个项目。这些项目被一个大的父项目包含。且这时父项目类型为pom类型。同时在父项目的pom.xml中出现表示包含的所有子模块。

总项目:一般总项目:POM项目

在这里插入图片描述

具体模块:

在这里插入图片描述

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

Maven 6、maven中的工程关系 的相关文章

随机推荐

  • '2.587426955E9' in column '2' is outside valid range for the datatype INTEGER.

    今天在展现人员信息时遇到这个错误 2 587426955E9 in column 2 is outside valid range for the datatype INTEGER 在网上查了 说是超出了INTEGER的最大长度 后经实践检
  • java 将图片转为base64返回给前端

    一 controller端代码 RequestMapping value captcha public void imagecode HttpServletRequest request HttpServletResponse respon
  • vue:前端接收并展示后端返回的一个图片对象(文件流)

    需求 前端接收并展示后端返回的一个图片对象 文件流 没有图片的时候 显示默认图片 1 HTML 造空间 展示图片 div class qrcodeBox img div 2 定义变量 这里require的作用是设置默认图片 data ret
  • H5页面在ios的浏览器上使用 高德地图 报当前定位失败Geolocation permission denied 或者 偶尔报AMap没有找到的

    1 解决报当前定位失败Geolocation permission denied 可以去高德api查看 常见问题 高德地图API amap com 图中红圈2 3 4 5 6对应Geolocation permission denied报错
  • JDBC中获取连接的几种方式,快来看看吧

    注 下面的连接均是以mysql为例 Test是Junit4的注解用于测试 Properties不会的话可自行百度 可能存在某些不规范的说法或者错误 恳请各位指出错误 方式一 import com mysql cj jdbc Driver i
  • Java模拟formdata发送请求-文件上传

    public String upload HttpHeaders httpHeaders RestTemplateUtils basicAuthenticationInfo poAuthConfig getUsername poAuthCo
  • java爬虫爬取主流房屋网站

    最近博主要做一些分析课题 所以使用java爬取了主流的房屋网站 搞些事情 下面是我搞事情的思路 在结尾处我会投放我的源码文件 供大家下载 导航 设计思路 项目的包与类详解 部分重要代码展示 源码下载 设计思路 想要爬取房屋的网站 就要有以下
  • ELM和RVFL两种网络的超详细介绍

    最近一直在跑程序 在看文章时注意到了这两种网络 ELM和RVFL 自己查阅资料做了简单的总结 希望在大家学习时帮助到大家 一 RVFL Random vector functional link network 首先明确一点 在进行分类的时
  • 【学习记录】win10 + ubuntu 22.04双系统安装

    一 背景 因为家里的台式 Windows 10 最近一直频繁蓝屏 再加上Win10之前经常性的资源管理器未响应 对Windows系统逐渐失去了信心 于是想着安装稳定性较好的Linux 以前抵触Linux是因为其人机交互界面没Windows那
  • Rabbit MQ使用

    rabbitmq支持 net framwork 3 5的最后版本 rabbitmq支持 net framwork 3 5的最后版本是3 4 3 安装步骤 1 工具 gt 库程序包管理器 进入程序包管控制台 2 Install Package
  • Python学习笔记 之 从入门到放弃

    笔记目录 9月22日 基础教程 基础知识 模块导入 用变量引用函数 或者Python中大多数的对象 将数值转换成字符串的方法 str类型 repr函数 9月23日 列表 元组 序列索引可以为负数 序列的分片和步长 序列相加 乘法 列表和字符
  • 深聊性能测试,从入门到放弃之:Locust性能自动化(二)代码实战

    Locust代码实战 1 引言 2 Locust实例展示 2 1 官网代码示例 2 2 Locust 代码模板及执行顺序 3 Locust 类代码分析 3 1 实例代码展示 3 2 classTaskSet 用法及展示 3 2 1 定义 3
  • caffe FCN网络的训练——以SIFT-Flow 数据集为例

    原文 http www cnblogs com xuanxufeng p 6243342 html 我在练习中根据操作稍微修改了一些内容 caffe fcn学习资料收集 可以参考这个训练 http blog csdn net wangkun
  • PyQuery库使用详解

    目录 一 初始化 1 字符串初始化 2 URL初始化 3 文件初始化 二 基本CSS选择器 三 查找元素 查找子元素 查找父元素 祖先节点 兄弟元素 四 遍历 五 获取信息 获取属性 获取文本 获取HTML 六 DOM操作 addClass
  • sql多对多关联查询php,MyBatis多对多关联查询(级联查询)

    其实 MyBatis 没有实现多对多级联 这是因为多对多级联可以通过两个一对多级联进行替换 例如 一个订单可以有多种商品 一种商品可以对应多个订单 订单与商品就是多对多的级联关系 使用一个中间表 订单记录表 就可以将多对多级联转换成两个一对
  • C++面试题(~01)

    冯诺依曼体系结构 冯诺依曼体系结构用于存储程序方式 指令和数据不加区别混合存储在同一存储器中 有如下特点 一律用二进制数表示数据和指令 顺序执行程序 执行前 将需要的程序和数据先放入存储器 PC为内存 当执行时把要执行的程序和要处理的数据按
  • nerf-pytorch3D 代码详细流程 debug

    train nerf py import main config内容 model class RadianceFieldRenderer def init 分 coarse fine 设置函数 if render pass coarse r
  • 在linux上,以root用户打开并且运行vscode

    最好的办法是把要运行的文件夹设置权限为 chmod 777 R dir name 这是我目前的解决办法 还没看到其他的自动保存的方法
  • d3dx9_35.dll如何修复

    使用电脑过程中 弹出d3dx9 35 dll文件的丢失总是让用户非常苦恼 对于第一次遇到这个问题的用户 可能他们并不知道如何处理这样的状况 但如果能上网查一下 解决这个弹窗问题的方法并不难 后续小编整理的内容便将为用户解决dll丢失弹窗问题
  • Maven 6、maven中的工程关系

    maven中的工程关系 Maven工具基于POM Project Object Model 项目对象模型 模式实现的 在Maven中每个项目都相当于是一个对象 对象 项目 和对象 项目 之间是有关系的 关系包含了 依赖 继承 聚合 实现Ma