《详解Maven的继承与聚合》一篇理解分模块设计理念,以及私服的使用
文章目录
- Maven高级
- 一、分模块设计
- (1)概念
- (2)作用
- 二、继承与聚合
- (1)继承
- 1.继承关系
- 2.版本锁定
- 3.三种打包方式
- (2)聚合
- (3)继承与聚合
- 三、私服
- (1)介绍
- (2)资源上传和下载
- 1.配置上传:
- 2.配置下载
Maven高级
一、分模块设计
(1)概念
将项目按照功能分成若干个子模块,这样的设计就叫做分模块设计。
如下图:
1.创建maven模块 tallias-pojo,存放实体类。
2.创建maven模块 talias-utils,存放相关工具类。
或者:
注意事项:
- 分模块开发需要先针对模块功能进行设计,再进行编码。不会先将工程开发完毕,然后进行拆分。
(2)作用
方便项目的管理维护、扩展,也方便模块间的互相调用,资源共享。
二、继承与聚合
(1)继承
1.继承关系
- 概念:继承描述的是两个工程间的关系,与 java 中的继承相似,子工程可以继承父工程中的配置信息,常见于依赖关系的继承。
- 作用:简化依赖配置、统一管理依赖
- 实现:
<parent>
…</parent>
继承的案例
目标:我们需要达到如下图的一个继承关系,其中各个子工程都需要一个叫Lombok的包:
一共需要三步:
①创建 maven 模块 tlias - parent,该工程为父工程,设置打包方式为 pom (默认打包方式为 jar)。
②在子工程的 pom.xml 文件中,配置继承关系。
③在父工程中配置各个工程共有的依赖Lombok(子工程会自动继承父工程的依赖)。
步骤:
①创建父包->tlias-parent
父包的pom文件配置如下:
<!-- 1.设置继承的父包 -->
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.5</version><relativePath/>
</parent><groupId>com.test</groupId>
<artifactId>tlias-parent</artifactId>
<version>1.0-SNAPSHOT</version><!-- 2.设置打包方式 -->
<packaging>pom</packaging>
②创建子包
各个子包的的pom文件配置如下:
<groupId>com.test</groupId><!-- 可省略 -->
<artifactId>tlias-pojo</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 1.设置继承的父包 -->
<parent><groupId>com.test</groupId><artifactId>tlias-parent</artifactId><version>1.0-SNAPSHOT</version><relativePath>../tlias-parent/pom.xml</relativePath>
</parent>
注意事项:
- 在子工程中,配置了继承关系之后,坐标中的groupId是可以省略的,因为会自动继承父工程的。
- relativePath指定父工程的pom文件的相对位置(如果不指定,将从本地仓库/远程仓库查找该工程)。
③在父工程中配置各个工程共有的依赖
(假设每一个子工程都需要一个叫Lombok的包)
<dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version></dependency>
</dependencies>
注意事项:
- 若父子工程都配置了同一个依赖的不同版本,以子工程的为准
2.版本锁定
①标签<dependencyManagement>
在上面讲的继承的时候,我们知道了父工程中会将大部分的公用依赖都包含,这个时候父工程中依赖会有很多,而依赖中经常会发生变化的就是【版本号】,对于依赖版本的管理我们就有了标签<dependencyManagement>
;
该标签只负责管理版本号,不会实际引入依赖。
注意事项:
<dependencyManagement>
与<dependencies>
的区别是什么?
<dependencies>
是直接依赖,在父工程配置了依赖,子工程会直接继承下来。<dependencyManagement>
是统一管理依赖版本,不会直接依赖,还需要在子工程中引入所需依赖(无需指定版本)- 子工程引入依赖的时候,无需指定
<version>
版本号,父工程统一管理,变更依赖版本,只需再父工程中统一变更
②标签<properties>
但是如果只是这样,当依赖过多的时候,依旧是不方便查找版本号
于时就可以使用自定义属性/引用属性:<properties>
在父工程的pom文件中:
3.三种打包方式
在pom文件中,我们可以设置
maven中有三种打包方式:
①jar:普通模块打包,springboot 项目基本都是 jar 包(内嵌 tomcat 运行)
②war:普通 web 程序打包,需要部署在外部的 tomcat 服务器中运行
③pom:父工程或聚合工程,该模块不写代码,仅进行依赖管理
(2)聚合
在 Maven 中,“聚合”(Aggregation)是一种管理多模块项目的机制,用于将多个独立的 Maven 模块(Module)组织成一个统一的项目结构,实现 “一键构建所有模块” 的效果。它解决了多模块项目中需要逐个构建模块的繁琐问题,让项目管理更高效。
父项目是一个特殊的 Maven 项目,其作用仅为 “管理子模块”,自身不包含业务代码。
maven中可以通过<modules>
设置当前聚合工程所包含的子模块名称。
<modules><module>../talias-pojo</module><module>../talias-utils</module><module>../talias-web-management</module>
</modules>
注意事项:
- 聚合工程中所包含的模块,在构建时,会自动根据模块间的依赖关系设置构建顺序,与聚合工程中模块的配置书写位置无关。
(3)继承与聚合
- 作用
- 聚合用于快速构建项目
- 继承用于简化依赖配置、统一管理依赖
- 相同点:
- 聚合与继承的 pom.xml 文件打包方式均为 pom,可以将两种关系制作到同一个 pom 文件中
- 聚合与继承均属于设计型模块,并无实际的模块内容
- 不同点:
- 聚合是在聚合工程中配置关系,聚合可以感知到参与聚合的模块有哪些
- 继承是在子模块中配置关系,父模块无法感知哪些子模块继承了自己
实际开发中,两者通常结合使用:父项目既作为聚合的管理者(通过 modules
),又作为配置的提供者(供子模块继承)。
三、私服
(1)介绍
私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的中央仓库,用于解决团队内部的资源共享与资源同步问题。
依赖的查找顺序:本地仓库–>私服–>中央仓库
注意事项:
- 私服在企业项目开发中,一个项目 / 公司,只需要一台即可(无需我们自己搭建,会使用即可)。
(2)资源上传和下载
central是从中央仓库中下载的
配置上传和下载都需要对maven的setting文件进行操作
其中,下载只需要在setting中配置,而上传还需要再maven工程的pom文件中配置
1.配置上传:
配置 Maven 私服的核心目标是实现项目构建产物的上传与依赖的统一管理
使用私服上传,需要在maven的setting.xml配置文件中,做出如下配置:
①setting.xml
- 设置私服的访问用户名 / 密码(settings.xml 中的 servers标签 中配置)
- server标签添加 访问nexus的账号和密码
<server><id>maven-releases</id><username>admin</username><password>123</password>
</server><server><id>maven-snapshots</id><username>admin</username><password>123</password>
</server>
id标签可以自定义,但是必须和maven工程中的distributionManagement标签的id保持一致,建议按照库名设置
②pom.xml:
1.IDEA的maven工程的pom文件配置上传(发布)地址
<distributionManagement><!-- release版本 --><repository><id>maven-releases</id><url>http://192.168.150.101:8081/repository/maven-releases/</url></repository><!-- snapshot版本 --><snapshotRepository><id>maven-snapshots</id><url>http://192.168.150.101:8081/repository/maven-snapshots/</url></snapshotRepository>
</distributionManagement>
2.发布项目,直接运行deploy生命周期即可(发布时,建议跳过单元测试)
发布的项目会上传到私服,不同版本的项目上传到不同的私服上。
执行
deploy
时:
- Maven 会读取 POM 文件中的
<distributionManagement>
配置,判断项目是 release 版本还是 snapshot 版本,然后根据版本类型将对应的构建产物上传到相应的仓库。- 若 POM 文件中的仓库
<id>
和settings.xml
中<server>
的<id>
匹配,Maven 就能获取到正确的用户名和密码进行认证,从而成功上传 JAR 包到私服。
2.配置下载
设置私服依赖下载的仓库组地址(settings.xml 中的 mirrors、profiles 中配置)
①setting.xml
- mirros标签设置访问路径,并设置id。(如果之前配置过阿里云需要删除)
- mirros标签添加 访问nexus的路径配置
<mirror><id>maven-public</id><mirrorOf>*</mirrorOf><url>http://192.168.150.101:8081/repository/maven-public/</url>
</mirror>
这里url选择的是【仓库组】:将多个仓库放入一个组,这样就无需指定多个仓库
注意事项:
如果该仓库不允许匿名访问,需要认证才能下载,则还需要如下操作:
【配置账号密码】就是使用server标签,id和mirror的id保持一致即可:
<server><id>maven-public</id><username>admin</username><password>123</password>
</server>
- pofiles标签中,增加如下配置:
<profile><id>allow-snapshots</id><activation><activeByDefault>true</activeByDefault></activation><repositories><repository><id>maven-public</id><url>http://192.168.150.101:8081/repository/maven-public/</url><releases><enabled>true</enabled></releases><snapshots><enabled>true</enabled></snapshots></repository></repositories>
</profile>
②pom.xml(可选)
如果setting中没有配置【pofiles标签】,那就需要进行这一步:
<repositories><repository><id>maven-public</id><url>http://192.168.150.101:8081/repository/maven-public/</url><releases><enabled>true</enabled></releases><snapshots><enabled>true</enabled></snapshots></repository></repositories>