十一、Maven高级
1、分模块设计与开发
为什么?将项目按照功能拆分成若干个子模块,方便项目的管理维护、扩展,也方便模块间的相互调用,资源共享。
分模块开发需要先针对模块功能进行设计,再进行编码。不会先将工程开发完毕,然后进行拆分。
实现步骤(如将utils工具类拆分出来):
- 创建一个是maven的模块,名字通常是项目名-功能名。
- 在模块中创建与项目相同的包结构
- 将对应的util类目录及其相关的工具类创建或拷贝到创建的模块中
- 在pom文件中导入util所需的相关依赖
- 在项目的pom文件中导入,提取出来的util模块
- 运行项目看看是否可以运行成功
2、继承与聚合
概念:继承描述的是两个工程间的关系,与java中的继承相似,子工程可以继承父工程中的配置信息,常见于依赖关系的继承。
作用:简化依赖配置、统一管理依赖。
实现::父工程坐标
2.1 继承关系实现
-
创建maven模块tlias-parent,该工程为父工程,设置打包方式pom(默认jar)。
jar:普通模块打包,springboot项目基本都是jar包( 内嵌tomcat运行)
war:普通web程序打包,需要部署在外部的tomcat服务器中运行
pom:父工程或聚合工程,该模块不写代码,仅进行依赖管理<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.6</version><relativePath/> <!--父工程路径,这个依赖是spring提供的,直接默认为本地仓库--></parent><!--该模块的配置信息--><groupId>com.yhzy</groupId><artifactId>mybatis-parent</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging> <!-- 打包方式应该是pom -->
-
在子工程的pom.xml文件中,配置继承关系。
<parent> <groupId>com.yhzy</ groupId> <artifactId>tlias-parent</artifactId> <version>1.0-SNAPSHOT< /version> <relativePath>../tlias-parent/pom.xm1</relativePath> <!--指定父工程的路径--> </parent>
-
在父工程中配置各个工程共有的依赖(子工程会自动继承父工程的依赖)。
<dependencies> <dependency> <groupId>org.projectlombok</groupId> < artifactId> lombok< / artifactId> <version>1.18.24< /version> </dependency> </dependencies>
注意:
在子工程中,配置了继承关系之后,坐标中的groupId是可以省略的,因为会自动继承父工程的。
relativePath指定父工程的pom文件的相对位置(如果不指定,将从本地仓库/远程仓库查找该工程)。
若父子工程都配置了同一个依赖的不同版本,以子工程的为准。
2.2 版本锁定
当多个模块(不是全部模块)都需要一个相同的依赖的时,为了保证每个模块引入的依赖的版本相同。
在maven中,可以在父工程的pom文件中通过来统一管 理依赖版本。
子工程引入依赖时,无需指定 版本号,父工程统一管理。变更依赖版本,只需在父工程中统一变更。
当依赖比较多时,通过上面这种方式来修改版本号也不太方便(查找比较慢),这时可以使用标签来自定义属性/引用属性,在引用依赖时使用${ }来引用变量。
<properties><fastjson.version>1.2.76</fastjson.version> <!--名字可以自定义,最好知其意--><jwt.jjwt-api.version>0.11.5</jwt.jjwt-api.version><jwt.jjwt-impl.version>0.11.5</jwt.jjwt-impl.version><jwt.jjwt-jackson.version>0.11.5</jwt.jjwt-jackson.version></properties><dependencyManagement><dependencies><!--JWT令牌--><!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-api --><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>${jwt.jjwt-api.version}</version></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId><version>${jwt.jjwt-impl.version}</version></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-jackson</artifactId><version>${jwt.jjwt-jackson.version}</version></dependency><!--fastJSON--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version></dependency></dependencies></dependencyManagement>
面试题:
与的区别是什么?
- 是直接依赖,在父工程配置了依赖,子工程会直接继承下来。
- 是统一管 理依赖版本,不会直接依赖,还需要在子工公程中引入所需依赖(无需指定版本)
2.3 聚合
当分模块开发时,需要对项目进行打包,这时就会发现,相关联的模块没有下载到Maven中打包会失败,就需要一个一个模块的进行下载(install)到Maven仓库中,比较繁琐。
聚合:将多个模块组织成一个整体,同时进行项目的构建。快速构建项目(无需根据依赖关系手动构建,直接在聚合工程上构建即可)
聚合工程:一个不具有业务功能的“空”工程(有且仅有一个pom文件),通常就是父工程。
实现:在父工程(聚合工程/parent)maven中可以通过 设置当前聚合工程所包含的子模块名称。
注意:聚合工程中所包含的模块,在构建时,会自动根据模块间的依赖关系设置构建顺序,与聚合工程中模块的配置书写位置无关。写完聚合模块配置后,就可以直接在父工程进行打包处理。
3、私服
私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的中央仓库,用于解决团队内部的资源共享与资源同步问题。
3.1 私服的资源上传与下载
RELEASE (发行版本) :功能趋于稳定、当前更新停止,可以用于发行的版本,存储在私服中的RELEASE仓库中。
SNAPSHOT (快照版本) :功能不稳定、尚处于开发中的版本,即快照版本,存储在私服的SNAPSHOT仓库中。
-
设置私服的访问用户名/密码(settings.xml中的servers标签中配置)
<!--配置两套--> <server> <id>maven-releases</id> <!--发行版--> <username>admin</username> <password>admin</password> </server><server> <id>maven-snapshots</id> <!--开发版--> <username >admin</username> <password>admin</password> </server>
-
IDEA的maven父工程的pom文件中配置上传(发布) 地址
<!--配置两套--> <distributionManagement> <repository> <id>maven-releases</id> <url>http://192.168.150.101:8081/repository/maven-releases/</ur1> </repository><snapshotRepository> <id>maven-snapshots</id> <url>http://192.168.150.101:8081/repository/maven-snapshots/</ur1> </snapshotRepository> </distributionManagement>
-
设置私服依赖下载的仓库组地址(settings . xml中的mirrors、profiles中配置)
<mirror> <id>maven-public</id> <mirror0f>*</mirror0f> <ur1>http://192.168.150.101:8081/repository/maven-pub1ic/</url> </mirror>
<kprofile> <id>allow-snapshots</id> <activation> <activeByDefault>true</activeByDefault> </activation> <repositories> <repository> <id>maven-public</id> <ur1>http://192.168.150.101:8081/repository/maven-public/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> </profile>
-
使用Maven中生命周期里的deploy,进行上传依赖。