Maven高级
分模块设计和开发
如果在我们自己的项目中全部功能在同一个项目中开发,在其他项目中想要使用我们封装的组件和工具类并不方便
不方便项目的维护和管理
项目中的通用组件难以复用
所以我们需要使用分模块设计
分模块设计
在项目设计阶段,可以将大的项目拆分成若干模块,按功能拆分,每个模块都是独立的.
先针对模块功能进行设计,再进行编码.
方便项目的管理和维护
方便模块间的相互调用和资源共享
分模块设计的优势
如果直接对项目进行依赖,因为会将所有工具类全部依赖进来,会影响性能,同时相当于整个业务代码全部公开,非常不安全.
继承
创建一个父工程,让其他模块对其进行继承,这样就可以将各个模块中共有的依赖都提取到父工程中进行配置,这样子工程都会继承父工程的依赖.
继承关系
Maven不支持多继承
因为Spring工程存在统一的父工程spring-boot-starter-parent
如果继承spring-boot-starter-parent就无法继承我们自定义的父工程tlias-parent
所以我们可以将统一父工程交给父工程去继承,如下所示
注:父工程打包的方式必须为pom
<packaging>pom</packaging>
Maven的打包方式
jar:默认打包方式,内嵌tomcat运行
war:普通web程序的打包方式,需要部署在外部的tomcat服务器中运行
pom:父工程或聚合工程,不写代码仅进行依赖管理
父子工程结构
可以同级也可以将子工程写在父工程下
版本锁定
当一个依赖不是被所有模块使用时,我们没有必要将其添加到
<dependencies></dependencies>
中,可以使用
<dependencyManagement></dependencyManagement>
进行统一的依赖版本管理,不会使依赖被所有子工程引用,同时使需要这些依赖的子模块引用更方便,版本统一.
<properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><jjwt.version>0.9.1</jjwt.version>
</properties><dependencyManagement><dependencies><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>${jjwt.version}</version></dependency></dependencies>
</dependencyManagement>
在父工程中的中指定版本,通过在
<properties></properties>
中我们可以将版本抽取成变量,格式如上所示,这个版本变量${…}可以直接在父工程和子工程中使用.
通过这样的版本统一设置,我们就可以在子工程中无需设置版本,只需要groupId和artifactId就可以进行依赖
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId>
</dependency>
聚合
对有继承关系的多个工程进行打包时,关系错综复杂,是可能出现问题的(找不到依赖,找不到模块等等),需要先将子模块先执行install到本地仓库,再对父模块进行打包.
如果使用maven的聚合
就可以实现对项目的一键构建(清理,编译,测试,打包安装等)
聚合:将多个模块组织成一个整体,同时进行项目的构建
无需根据依赖关系手动构建,可以直接在聚合工程上构建
聚合工程:一个不具有业务功能的"空"工程(有且仅有一个pom文件),其中没有代码,一般就是继承关系中的父工程
聚合的实现
在聚合工程中的pom文件中,在modules标签中对模块进行整合
<modules><module>../tlias-pojo</module><module>../tlias-utils</module><module>../tlias-web-management</module>
</modules>
聚合之后子模块会在聚合在聚合工程下
只要对聚合工程执行package打包命令就会对聚合的所有模块执行打包命令,即一键构建.
继承和聚合的对比
聚合用于快速构建项目
继承用于简化依赖的配置和统一管理依赖
相同点
聚合和继承的pom文件打包方式均为pom,聚合工程和继承的父工程往往为同一个工程
聚合和继承都属于设计型模块,并无实际模块内容
不同点
聚合是在聚合工程中进行关系配置,可以感知到参与聚合的模块(modules中写明了参与聚合的模块)
继承是在子模块中进行配置(写明parent),父模块无法感知到哪些子模块继承了自己
私服
快照版本(snapshot):存入快照仓库
不断的开发更新,可以对同一个快照版本进行多次发布
<version>1.0-SNAPSHOT</version>
发布版本(release):存入发布仓库
相对稳定的对外版本
<version>1.0</version>
Central仓库
存储从中央仓库下载的依赖
快照版会用最新版本覆盖
发布版不会被覆盖
私服配置
在本地maven的设置中配置依赖下载地址
在本地maven的设置中配置私服的访问用户名和密码
在maven工程pom文件中配置上传地址