【Maven】
☞Maven入门教程-Maven项目实战☜
十一、Maven项目之间的关系
1. 问题
目前我们可以使用Maven来创建项目,并且使用Maven来管理项目中的第三方的资源,同时当我们将项目的功能开发完成后,将自己的项目通过maven打包到本地仓库中,提供给其他项目使用,但是在该流程中存在以下的问题:
问题一:
项目A中根据开发需求,将代码根据功能进行了分层,例如使用MVC的分层思想,将项目A的代码分为了service层pojo层,mapper层等。那么在项目B中需要使用项目A已经开发好的功能,我们目前会使用Maven将整个项目A的资源全部打包放到本地仓库中,但是项目B需要使用的是项目A中的部分功能不是所有的功能,按照目前这种方式会造成项目B中引入的是项目A的整个资源,造成项目B在资源加载时效率过低,浪费资源。
总结:
打包项目整个项目打成一个包,造成资源使用不方便。
问题二:
我们使用Maven创建了三个项目,并且这三个项目,都在使用SSM的功能,那么我们就需要在三个项目的pom.xml文件都要引入SSM的资源坐标。后期如果我们需要升级SSM的资源的版本号或者需要在三个项目中都引入其他的资源时,我们需要同时修改三个pom文件,麻烦!
总结:
不同的maven项目会使用到相同的资源,造成资源修改麻烦。
2. 解决
2.1问题一的解决
打包项目的方式过于死板,打的是整个包。因为我们目前开发一个项目,会将项目所有的功能放在一个项目全部声明。而maven打包的基础单位是一个maven项目,也就说一个maven的project会被打成一个包。根据maven的打包规则,以及我们自己的项目功能对外提供的需求。我们需要在开发项目时,由以前在一个maven project中声明项 目的所有功能代码,变为在N个maven project中来完成项目功能的开发,每个maven project中声明一部分功能代码,但是当我们使用maven去运行 我们的项目时,maven会将N个project中的代码合并为一个项目。也就说在物理视图项目,一个项目的功能代码被拆分到N个项目中完成,在逻辑上这N个项目是一个项目。这样我们在使用Maven去打包项目的时候,maven 会将项目的N个project分别打包,最后打成N个包,其他人就可以根据自 己的需求来获取指定的资源使用了。
2.2问题二的解决
不同的项目之间使用相同的资源坐标,不好管理。我们将不同的项目中需要使用的相同的资源进行抽取,抽取为一个公共的配置然后让其他的项目呢都引用该功能配置即可。
3. 实现
- 依赖关系
- 继承关系
- 聚合关系
十二、Maven项目之间的依赖关系
1. 依赖关系的介绍
项目A中会使用项目B中的资源,我们会将项目B的包导入到项目A中使用,那么项目A和项目B之间就是依赖关系。项目A依赖项目B。
2. Maven项目依赖关系的使用
- 创建项目A完成功能开发
- 在项目A的pom文件中配置项目B或者其他第三方资源的资源坐标
- 在项目A中正常调用项目B的资源即可。
3. Maven 依赖范围及依赖原则
3.1.依赖范围
在maven的pom.xml文件中 定义依赖除了 groupId ,artifactId,version三个必要的标签外,还见过另外一个标签scope(如下)。没错这个标签就是我下面要说的依赖范围。
<dependencies>
其实maven中的依赖范围有很多种,但是我们常用的只有以下三种,我们掌握这三种就够用了。他们分别是 compile (编译)范围依赖,test(测试)依赖,provided依赖。那问题来了我们在定义依赖的时候这个scope 该怎么填呢?我们先讲一下判定规则:
- 是否参与部署是否对main主程序有效
- 是否对test测试程序有效
- 是否参与打包
- 针对程序结构(分主程序和测试程序)的依赖
3.2.依赖原则
● 路径不同间接依赖中maven采用的是路径最短者优先
● 路径相同间接依赖中maven 采用的是依赖定义顺序从上到下
4. 注意
在开发阶段,并且在同一个工作空间,不同的maven项目之间可以通过资源
坐标直接调用其资源,无需将其打包放到本地仓库中。但是在项目运行期间,必 须根据依赖关系的顺序依次打包,才能正常运行。比如A-->B--->C--->D
打包的顺序为先打包D再打包C再打包B再打包A。最简单的记忆方法,就是
不管是开发阶段还是运行阶段只要项目A依赖的其他项目都需要进行打包,其他 项目每修改依次就重新打包一次。
十三、Maven项目之间的继承关系
1. 继承关系的介绍
继承关系指的是两个事物之间的逻辑联系,比如在现实生活中的父子之间存在继承关系,具备继承关系的两个事物之间具备以下特点:
子拥有父的所有资源。子可以调用父的资源。
注意:
java基本语法中的继承是继承理论的一种应用。
2. maven项目中使用继承关系管理资源
项目A继承项目B,那么项目A就直接拥有项目B中的资源。资源指的是项目B通过pom文件获取的资源,不是项目B中的功能代码资源。也就说maven项目之间的继承是pom资源之间的继承,不是项目功能代码的继承。
3. maven项目中的继承关系的代码实现案例
3.1 创建两个maven项目,项目parent和项目child
3.2 建立两个项目之间的继承关系
在子项目中的pom.xml文件中使用parent标签,并声明父项目的资源坐标即可。
3.3 观察在父项目中配置资源,在子项目中是否会自动加载相关资源
4.继承关系中的父项目的作用
4.1 pom项目类型的介绍
在maven中使用继承关系主要目的是管理项目的公共资源的,在父项目中对公共资源可以统一的进行维护,子项目自然就发生了变更。基于这样的考虑在父项目中完全没有必须去声明功能代码的,所以在父项目中也就不需要声明功能代码的目录结构体系,只需要保留pom文件管理资源即可。那么也就说我们希望创建一个只做资源管理,不做功能开发的项目。所以maven专门提供了一个pom类型的项目,我们使用继承关系的父项目的类型为pom类型即可。
总结:
pom类型的项目只做资源管理,不做功能开发。在继承关系中父项目创建为pom类型比较合理。
4.2 pom类型项目的创建
先创建一个jar类型的项目,然后将目录结构删除,只保留pom文件然后在pom文件中使用packaging标签修改项目的类型为pom类型。
5.注意
(1) maven项目的继承关系中的父项目要创建为pom类型
(2) 继承关系中的maven项目是相互独立的,本质就是两个项目比如项目A继承了项 目B,项目A和项目B的功能还是各自的功能,是独立只不过在项目A中可以拥 有项目B的第三方资源。项目B的所有子项目之 间也是相互独立的。
十四、Maven项目的聚合关系
1. 聚合关系介绍
依赖关系是A调用B中的功能资源。继承关系是A可以拥有B中的声明的资源。我们希望maven在将我们的项目进行打包上传本地仓库时,将项目根据功能拆分成不同的包上传,可以让其他人根据需求使用。但是maven打包是按照项目为基本单位打包的,那么也就说我们需要将一个本来在一个maven项目中声明的代码,拆分为N个项目声明,并且在运行的时候还会合并成一个项目。这N个项目之间的关系我们就成为聚合关系。
总结:
聚合关系:
将本来一个整体的事物,拆分为不同的零件。每个零件在物理视图上是独立的,也就说肉眼看到的是多个零件。但是在逻辑上这些零件是属于一个个体的。这些零件之间的关系就是聚合关系。
举例说明:
依赖关系
小明和小红是同事,小红负责将货物装车,小明负责开车。小明依赖小红,只有小红将获取装车完毕,小明才能开车。
继承关系
小明和老明是父子关系,老明突然有一天中了500万,小明呢这个时候正好要娶小红,直接从这500万中拿了100万买了个房子。小明在直接调用老明的资源。
聚合关系
小明在和小红婚后过去了美滋滋的小日子,但是突然有一天小明感到一丝丝的不舒服,去医院检查了一下是肺上有了功能问题,需要換肺。找到合适的器官源后,小明换了一个新的肺。小明的内脏器官之间是聚合的关系,都是隶属于小明的,并且每个器官都有自己的职责不同的器官的联合运行,撑起了小明的生命。
2. maven项目中使用聚合关系的流程
2.1 创建一个pom项目
2.2 记录子项目之间的逻辑关系。
统一管理项目的资源,每个子项目的pom文件的依赖的并集。
让子项目都继承该pom项目。
2.3 根据MVC的代码结构,将项目拆分,拆分为四个子项目
- pojo项目
- mapper项目
- service项目
- web项目
2.4 配置子项目之间的依赖关系
web-->service-->mapper--->pojo
总结:
我们在使用了聚合关系将项目拆分为N个子项目后,为了便于N个子项目的资源的统一,N个子项目继承同一个父项目。又因为N个子项目开发的是同一个功能,子项目之间又存在相互的调用,使用依赖关系来实现子项目之间的相互调用。