Maven进阶
这里写目录标题
- 1.分模块开发
- 1.1 模块更新后,会造成的影响
- 2.依赖管理
- 2.1 依赖传递
- 2.2 可选依赖(隐藏自己的依赖,不让别人用)
- 2.3 排除依赖(用别人的资源,把不用的去了)
- 3.聚合与继承
- 3.1 为什么要使用聚合工程?
- 3.2 聚合工程开发
- 2.1 聚合工程
- 三级目录
1.分模块开发
我们之前做的项目,是将功能模块都汇聚到一起,这样会导致项目结构非常庞大,不利于开发人员的维护和开发,我希望是我做这个功能模块,那我就只要关心这个功能模块
一、模块拆分原则
目的:项目的扩展性变强了,方便其他项目引用相同的功能。
将原始模块按照功能拆分成若干个子模块,方便模块间的相互调用,接口共享
二、 通过maven指令安装模块到本地仓库(install指令)
我们写到一个功能模块后,使用mvn install命令将功能模块发布到本地仓库中(团队共享的仓库,也被称为私服)
三、 依赖管理
<!--设置当前项目所依赖的所有jar-->
<dependencies><!--设置具体的依赖--><dependency><!--依赖所属群组id--><groupId>org.springframework</groupId><!--依赖所属项目id--><artifactId>spring-webmvc</artifactId><!--依赖版本号--><version>5.2.10.RELEASE</version></dependency>
</dependencies>
1.1 模块更新后,会造成的影响
举例:例如有controller、service、dao、pojo这四个模块,其中controller依赖service、service依赖dao、dao依赖pojo,那如果我们对pojo这个模块的功能进行修改, 此时启动服务会有哪些影响?
一、回答这个问题前,首先我们明确一点:即服务的启动流程
无论是普通的main函数,还是通过引导类启动服务,都会先对项目结构进行编译(compile),编译通过,才能启动函数/服务.
编译时会根据pom.xml文件中的依赖关系,从底层依赖开始编译,此时就会根据pojo的坐标,在本地仓库中找到pojo的jar包,编译通过,继续往上编译,只要当编译全部通过,才会启动服务
所以我们要清楚
- controller中只有service的jar包坐标(非包含service的jar包)
- service中只有dao的jar包坐标(非包含dao的jar包)
- dao中只有pojo的jar坐标(非包含pojo的jar包)
如果service的jar包包含dao的jar包,就不可能只有3KB
二、此时我们可以回答这个问题:
如果我们修改了pojo模块分为两种情况
- 情况一:如果pojo类修改了,没有install,此时执行的是修改前的逻辑
- 情况二:如果pojo类修改了,进行install,此时执行的是修改后的逻辑
我们只需要对pojo进行install,更新pojo的jar包即可,不用对service和dao的包进行install(因为jar包中只是引用依赖,而非依赖实际存在)
三、特殊情况
如果我们在同一个project中打开controller、service、dao、pojo,此时当我们修改了pojo中的代码(没有install),并启动项目,此时运行的也是修改后的代码哦!!!
2.依赖管理
2.1 依赖传递
- 路径优先: 当依赖中出现相同的资源时, 层级约深, 优先级越低, 层级越浅, 优先级越高
- 声明优先: 当资源在相同层级被依赖时, 配置顺序靠前的覆盖配置顺序靠后的(非直接依赖)
- 当同级配置了相同资源的不同版本,后配置的覆盖先配置的(直接依赖)
2.2 可选依赖(隐藏自己的依赖,不让别人用)
可选依赖指对外隐藏当前所依赖的资源————不透明
<dependency><groupId>com.itheima</groupId><artifactId>maven_03_pojo</artifactId><version>1.0-SNAPSHOT</version><!--可选依赖是隐藏当前工程所依赖的资源,隐藏后对应资源将不具有依赖传递性--><optional>false</optional>
</dependency>
2.3 排除依赖(用别人的资源,把不用的去了)
- 排除依赖指主动断开依赖的资源,被排除的资源无需指定版本
- 排除依赖资源仅指定GA即可,无需指定V
<dependency><groupId>com.itheima</groupId><artifactId>maven_04_dao</artifactId><version>1.0-SNAPSHOT</version><!--排除依赖是隐藏当前资源对应的依赖关系--><exclusions><exclusion><groupId>log4j</groupId><artifactId>log4j</artifactId></exclusion><exclusion><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId></exclusion></exclusions>
</dependency>
3.聚合与继承
聚合工程:通常是一个不具有业务功能的”空“工程(有且仅有一个pom文件)
作用:
使用聚合工程可以将多个工程编组,通过对聚合工程进行构建,实现对所包含的模块进行同步构建
3.1 为什么要使用聚合工程?
一、报错提醒
保证所有的module都在同一个project中,此时修改某一个module中的代码,在其他module中会有提醒
二、同步构建
例如service中某个方法新增了一段代码(这种修改不会报错),但是service并没有install.此时我们对最上层的module(此处为controller)进行package,它package的时候是直接拿本地仓库中的service的jar进行package的
解决方式:
通过对聚合工程进行构建,实现对所包含的模块进行同步构建
; 即一起compile、一起install、一起package…
3.2 聚合工程开发
一、创建maven模块,设置打包类型为pom
maven_parent为聚合工程,需要将打包方式改为pom
打包方式为POM标识此项目是聚合工程
<packaging>pom</packaging>
每个maven工程都有对应的打包方式,默认为jar,web工程打包方式为war
二、设置当前聚合工程所包含的子模块名称
<modules><module>../maven_ssm</module><module>../maven_pojo</module><module>../maven_dao</module>
</modules>