一、maven介绍
1、简介
Maven是一个项目管理工具(构建工程、管理jar包、编译代码、完成测试、项目打包)
Maven是基于POM(project object model 项目对象模型)实现的
Maven标准化了项目结构
Maven提供了一个免费的中央仓库 开源jar包
Maven是跨平台的
2、作用
一键构建:编译、测试、打包、安装、部署一系列过程称作“构建”,在maven中可以一键完成
依赖管理:
不使用maven的项目,磁盘空间被jar包占据,资源浪费
使用maven的项目,项目中不存放jar包,maven会建立一个仓库来统一管理jar包,所有项目共享这个仓库
3、工程的类型和结构
POM工程:逻辑工程,不含java代码
JAR工程:普通java工程
WAR工场:java web工程
工程结构:
- src:源码
- target:编译生成的文件
- pom.xml:maven工程配置文件
项目结构:
src/main/java:存放项目的java 文件
src/main/resources:存放项目资源文件,如配置文件
src/test/java:存放项目的测试文件
src/test/resources:存放测试时的资源文件
二、一键构建
1、项目的生命周期
验证--编译--测试--打包--检查--安装--部署
2、maven常用命令
mvn clean:清除编译的class文件,即删除target目录
mvn validate:验证项目是否正确
mvn compile:编译maven,创建target目录
mvn test:编译maven,并运行测试文件
mvn package:编译maven,运行测试文件,并打包
mvn install:编译maven项目,运行测试文件,打包,并发布到本地仓库
mvn deploy:部署项目到远程仓库
mvn tomcat7:run:使用tomcat运行项目
三、依赖管理
1、maven仓库类型
本地仓库:maven只访问本地仓库,本地仓库没有则会从远程拉取到本地仓库
远程仓库:私服
中央仓库:maven提供,最全的仓库(一般配置镜像,访问镜像源)
2、maven配置文件
配置文件位置:maven/conf/settings.xml
修改本地仓库位置: 通过<localRepository>标签配置本地仓库位置
配置镜像:通过<mirrors>标签下的<mirror>标签配置,例如配置阿里云镜像:
<mirror> <!-- 指定镜像ID --><id>nexus-aliyun</id> <!-- 匹配中央仓库。--><mirrorOf>central</mirrorOf><!-- 指定镜像名称 --> <name>Nexus aliyun</name> <!-- 指定镜像路径 --> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror>
配置jdk版本:maven默认使用jdk 1.5版本来验证语法,可以通过<profiles>标签配置,例如配置jdk 11
<profile> <id>jdk11</id> <activation> <activeByDefault>true</activeByDefault> <jdk>11</jdk> </activation> <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> <maven.compiler.compilerVersion>11</maven.compiler.compilerVersion> </properties> </profile>
3、idea中配置maven插件
注意:idea2020只支持maven3.6.3及以下的版本
在idea中file/settings/maven下,进行三项配置:
Maven home:Maven的安装目录
User settings file:maven/conf/settings.xml文件所在位置
Local repository:本地仓库所在位置
四、Maven工程开发
1、构建Maven工程
在idea中创建maven web项目:
新建项目选择maven项目---选择模板webapp---编写项目名、项目组位置(com.单位名)---进行maven配置(上面三项)
2、pom文件配置
依赖管理:
<dependency><groupId>junit</groupId> 依赖组名称<artifactId>junit</artifactId> 依赖名称<version>4.13.1</version> 版本号<scope>test</scope> 依赖的作用范围</dependency>
插件管理:
<!-- tomcat7插件 --> <plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><port>8080</port><path>/</path><urlEncoding>UTF-8</urlEncoding><server>tomcat7</server></configuration> </plugin>
五、Maven工程测试
1、Junit使用步骤
在main/java下添加被测类的代码
在test/java下添加测试类,测试类的写法注意以下三点:
- 方法名一般是test+被测方法名
- 在测试方法上方加上注解@Test
- 测试方法没有参数和返回值
2、Junit结果判定(断言)
断言:Assert.assertEquals(exp, act)
第一个参数:预期结果
第二个参数:实际结果
3、Junit测试夹具
@Before:测试执行之前执行
@After:测试执行之后执行
六、依赖冲突调节
maven原则:最短路径优先、最先声明
1、依赖产生的原因--依赖传递
依赖A引入了依赖C,依赖B也引入了依赖C,当同时引入依赖A、B的时候,就会引入两个依赖C,就会产生依赖冲突
2、最短路径优先原则
还是如上条件,依赖A、B同时引入依赖C;不同的是依赖A直接引入依赖C,依赖B通过依赖D来引入依赖C,那么根据最短路径优先原则,会保留依赖A引入的依赖C,依赖B则不会引入依赖C
3、最先声明原则
在依赖路径长度相等的情况下,谁现在pom文件中声明,谁就优先
4、排除依赖,锁定版本
排除依赖:在引入依赖的过程中,将产生冲突的依赖在其中一个依赖中排除在外
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.12.RELEASE</version><exclusions><exclusion><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId></exclusion></exclusions> </dependency>
锁定版本:直接将冲突的依赖手动引入,锁定版本
<dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>4.2.4.RELEASE</version></dependency></dependencies> </dependencyManagement>
七、Maven聚合开发
聚合关系、继承关系
1、聚合关系
举例:电商买家项目、电商卖家项目
将可以共用的部分打成jar包放到仓库中
共用部分:dao层、domain层(java bean)、service层
买家控制层controller---引入上面的jar
卖家控制层controller---引入上面的jar
Maven在打包时,会将共用部分+各自单独的部分合并到一起打包,产生一个完整的可以运行的一个端的代码包
2、继承关系
Maven父工程定义的依赖和插件子工程可以直接使用
Maven是单继承,如果想要实现多继承,可以曲线救国(即用引用依赖的方式)
Maven父工程是一个POM工程(逻辑工程),在父工程中可以引入管理所需要的三方jar包,例如Junit、mysql、druid、servlet、jsp、taglib等;还有插件如tomcat
子工程继承父工程是通过在pom中配置
<parent><groupId>com.compnay</groupId><artifactId>parent_name</artifactId><version>1.0-SNAPSHOT</version> </parent>
dao和service工程都继承父工程,service工程又依赖dao工程,web工程又依赖service工程
项目运行时,可以直接运行父工程,也可以在本地发布了dao和service工程后,单独运行web工程
依赖传递失效原因和解决办法:
Maven在定义依赖传递时,一些依赖范围的依赖无法传递