Maven基础及进阶笔记
学习视频来源:学习视频
一、maven基础
maven的两大基础功能
- 依赖管理
- 基于POM【项目对象模型】通过仓库以坐标的形式来管理
- 项目构建
- 一个项目开发完成,需经历以下步骤
清理–>编译–>测试–>打包–>安装–>部署 - maven对于项目构建提供了插件机制,每个构建的过程都只需要一个命令就可以完成
maven安装
1、下载解压maven的压缩包
2、配置本地仓库路径
3、配置环境变量 MAVEN_HOME PATH
4、配置阿里云镜像
5、配置maven jdk编译版本
6、命令行执行mvn -v 可以查看版本即可
仓库
本地:电脑上的一个文件夹
远程:公司私服,不对外开放
中央:maven团队维护,对外开放
maven下载jar流程:
1、根据pom中的依赖,先从本地仓库找,如果找到则直接使用
2、如果找不到,就看配置私服没有
3、配置了私服时,私服有就下载,私服上没有则去中央仓库下载到私服,没配置私服就直接去中央仓库找
4、中央仓库中查找失败,则会在本地仓库中留下错误jar包信息
maven的打包方式
- jar:打成jar包,可以安装到本地仓库或者被其他应用以坐标的形式去使用(不写打包方式,默认打jar包)
- war:打成war包,使用tomcat插件来部署运行war包,可以在浏览器中访问
- pom:达成pom(直接就是一个pom.xml文件),表示当前工程是个父工程,可以被子工程继承,也可以管理子工程,父工程的打包方式必须是pom
maven文件目录
注意事项:
1.普通打jar的工程,建议用idea生成maven工程是不要选择构建,直接生成最简单的maven目录(学习阶段最好从简单开始学起,配置都自己来配)
2. 打成war包的工程,可以将打jar包的pom打包方式修改成war,在main目录下另增加webapp\WEB-INF\web.xml即可
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
</web-app>
nexus私服的安装与配置(windows,sun jdk1.8)
- 下载安装包:nexus-2.14.14-01-bundle.zip
下载链接:7jgk - 解压该安装包,并在解压bin文件夹路径下,用管理员权限打开cmd
- 执行命令 nexus install
此时可在windows服务中看到
- 修改nexus的运行端口(非必要操作,按需修改,配置文件路径nexus-2.14.14-01\conf\nexus.properties)
- 在bin目录下执行nexus start
ps:如果运行失败可能是nexus缺少必要jar包(jaxb-api-2.3.0.jar,javax.activation-api-1.2.0.jar),jar包下载链接:7jgk
将这两个jar放在nexus-2.14.14-01\lib目录下,重新执行nexus start即可
6.访问nexus
安装到本机直接访问:http://localhost:8018/nexus/#welcome
登录默认用户名及密码为:admin,admin123
nexus私服面板介绍
注意事项:
快照版本上传到私服的命名格式:在版本号中体现为有关键字:SNAPSHOT或者带有时间戳,例如:1.0-SNAPSHOT或者1.0-20220723.115808-1.jar,版本号-8位日期.6位时间-快照下标(这个版本快照已经发了多少次)
- 如果在版本号中含有关键字SNAPSHOT,则Maven会自动打上时间戳和快照下标
- 有了时间戳,Maven就可以提供最新的快照进行下载
- 而对于本地的POM.xml文件的依赖版本号一直可以不变,比如1.0-SNAPSHOT,Maven始终会帮你下载到最新的版本
maven配置私服,私服的上传下载
实践idea项目的下载链接:7jgk
1、先在maven的settings.xml配置文件中配置子标签
<server>
<id>local-nexus</id> <!--nexus认证id-->
<username>admin</username>
<password>admin123</password>
</server>
2、在先在maven的settings.xml配置文件中配置子标签
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>local-nexus</id><!-- 此处的id要与server中的一致 nexus-public-->
<name>nexus-public-repo</name><!-- 名字随意-->
<!-- 对应nexus中仓库的地址-->
<url>http://localhost:8018/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<!--是否下载snapshots构件-->
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</profile>
```
3、在先在maven的settings.xml配置文件中配置<activeProfiles>标签,
```xml
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
4、在maven项目的pom.xml中添加发布版本以及快照版本的上传地址
<distributionManagement>
<repository>
<id>local-nexus</id><!--nexus认证id-->
<url>http://localhost:8018/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>local-nexus</id>
<url>http://localhost:8018/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
5、编写代码,最后执行maven的deploy命令测试私服的上传以及下载(此处使用idea执行)
二、maven进阶
maven开发思想
约定>配置>编码
约定:开发需要遵循某些特定的规则,如果不遵循,就会出现一些没法解释的问题
配置:开发把使用代码完成的工作,用配置的形式来规范化,这些配置都是模板化的
编码:需要人为编写的业务代码
maven基于依赖管理的特性
1. 依赖传递
- 项目中要使用spring-ioc的相关依赖
- 只需要导入spring-context依赖即可
- 因为maven会去判断当前依赖spring-context要正常使用,必须要有相关依赖的支持,就会自动导入相关依赖
直接依赖:手动导入的依赖
间接依赖:通过依赖传递特性传递进来的依赖
2.依赖冲突
举例:
项目中引用了A依赖,B依赖:
A依赖由于依赖传递,需要引用C依赖的支持【C-1.0】
B依赖由于依赖传递,需要引用C依赖的支持【C-1.1】
此时,因为C依赖版本不同,导致项目中不知道具体使用哪个版本,就认为产生了冲突(冲突情形之一)。
冲突可能导致项目无法编译。
此时idea工程中具体用的那个依赖,可查看项目的External Libraries【外部库】
冲突解决:
- 第一声明优先原则(maven会使用该方式解决冲突)
在pom.xml中,依赖书写位置靠上的,优先生效 - 路径近者优先
直接依赖优先于间接依赖
间接依赖之间,层级靠前者优先 - 版本锁定+直接排除法
项目可能使用到几十甚至几百个依赖,一般不可能把依赖都通过直接导入的方式写入pom.xml中,那么依赖冲突就没有办法完全解决
- 直接排除法
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
- 版本锁定
properties标签用来定义依赖的版本
dependencyManagement标签用来锁定依赖的版本,此标签只用来锁定版本,不表示引用实际依赖,锁定功能一般是父工程完成的
dependencies标签用来导入依赖【无需指定依赖版本】
<properties>
<junit-verison>4.12</junit-verison>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit-verison}</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!--单元测试jar-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependencies>
maven继承
- 概述:项目与项目之间的继承
- 两个概念和要求:
父工程:打包方式必须是pom
子工程【子模块】:也可以作为父工程存在
父工程的作用:
集中管理依赖:一般定义子模块共有的依赖
聚合:统一对子模块进行操作
如何继承:
在子模块中使用parent标签来指定父工程的GAV坐标接即可,一旦继承,子工程就会具有父工程的依赖
如工程存在问题,需要检查以下两处
1、父模块是否引用该标签
<dependencyManagement>
</dependencyManagement>
2、子模块是否继承父魔块
<parent>
<artifactId>mybatisdemo</artifactId>
<groupId>net.togogo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
确认三处后重新reimport,或者尝试在父模块中引用
maven聚合
- 是父工程的作用,用来统一操作子模块
- 继承与聚合不是一定要一起使用的
父工程聚合子模块需在pom.xml中添加
<modules>
<module>firstdemo</module>
</modules>
聚合后,对父工程的操作(clean complie等),对其子工程也生效,一般有聚合后就会尽量少的写任务,只留一个pom.xml
maven拆分
- 把一个完整的项目按需拆分成独立的子模块,以不同的打包方式来表示当前小模块。
- 然后用父工程聚合功能把这些拆分出来的小模块合成一起,变成一个完整的项目
- 如果这些小模块在其他项目中使用,可以直接以GAV的形式从仓库中获取,提供模块可重用性,减少冗杂代码
拆分方式 - 小项目:按层
- 大项目:按业务拆分,类似后续要学习的微服务,每个小模块提供不同的功能(服务),因为功能很小很细,所以又叫“微服务”
三、maven使用小tips
- 在父项目下执行deploy时,会把整个项目所有子模块都deploy到私服,包括web模块。在deploy后加 -N可以解决
-N 的解释:不会递归到子项目里执行当前命令
mvn deploy -Dmaven.test.skip=true -N
参考资料:https://blog.csdn.net/chenxuegui1234/article/details/103577426