Maven
Maven基础
Maven简介
Maven是什么
Maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)
POM:Project Object Model 项目对象模型
Maven的作用
- 项目构建:提供标准的,跨平台的自动化项目构建方式
- 依赖管理:方便快捷的管理项目依赖的资源包(jar包),避免资源间的版本冲突问题
- 统一开发结构:提供标准的统一的项目结构
Maven基础概念
仓库
仓库:用于存储各种资源,包含各种jar包
仓库分类:
- 本地仓库:自己电脑上存储资源的仓库,可连接远程仓库获取资源
- 远程仓库:非本机电脑上的仓库,为本地仓库提供资源
– 中央仓库 :Maven团队维护,存储所有资源的仓库
– 私服:部门/公司范围内存储资源的仓库,从中央仓库获取资源,部门/公司的员工可向私服中提交资源 - 私服的作用:
– 保护具有版权的资源,包括购买或者自主研发的jar(中央仓库中的资源都是开源的,不能存储具有版权的资源)
– 一定范围内资源共享,仅对内部开发放,不对外共享
坐标
坐标:Maven中坐标用于描述仓库中资源的位置
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
<packaging>jar</packaging>
Maven坐标的组成:
- groupId:定义当前Maven项目隶属组织名称(通常是域名反写,例如:org.mybatis)
- artifactId:定义当前Maven项目名称(通常是模名)
- version:定义当前版本号(RELEASE为正式版,SNAPSHOT为开发版本)
- packaging:定义该项目的打包方式(在pom文件中没有指定packaging的值,默认打成jar包,取值有jar,war,ear,pom)
Maven坐标的作用:使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别与下载工作交给机器完成
Maven项目构建命令
Maven构建命令使用mvn开头,后面添加功能参数,可以一次执行多个命令,使用空格分开
mvn compile #编译
mvn clean #清理
mvn test #测试
mvn package #打包
mvn install #安装到本地仓库
项目构建生命周期
Maven构建生命周期描述的是一次构建过程经历了多少个事件
Maven对项目构建的生命周期分为三套
- clean:清理工作
- default:核心工作,例如编译,测试,打包,部署等
- site:产生报告,发布站点等
clean生命周期
- pre-clean:执行一些需要在clean之前完成的工作
- clean:移除所有上一次构建生成的文件
- post-clean:执行一些需要在clean之后立刻完成的工作
default构建生命周期
- validate(校验) 校验项目是否正确并且所有必要的信息可以完成项目的构建过程。
- initialize(初始化) 初始化构建状态,比如设置属性值。
- generate-sources(生成源代码) 生成包含在编译阶段中的任何源代码。
- process-sources(处理源代码) 处理源代码,比如说,过滤任意值。
- generate-resources(生成资源文件) 生成将会包含在项目包中的资源文件。
- process-resources (处理资源文件) 复制和处理资源到目标目录,为打包阶段最好准备。
- compile(编译) 编译项目的源代码。
- process-classes(处理类文件) 处理编译生成的文件,比如说对Java class文件做字节码改善优化。
- generate-test-sources(生成测试源代码) 生成包含在编译阶段中的任何测试源代码。
- process-test-sources(处理测试源代码) 处理测试源代码,比如说,过滤任意值。
- generate-test-resources(生成测试资源文件) 为测试创建资源文件。
- process-test-resources(处理测试资源文件) 复制和处理测试资源到目标目录。
- test-compile(编译测试源码) 编译测试源代码到测试目标目录.
- process-test-classes(处理测试类文件) 处理测试源码编译生成的文件。
- test(测试) 使用合适的单元测试框架运行测试(Juint是其中之一)。
- prepare-package(准备打包) 在实际打包之前,执行任何的必要的操作为打包做准备。
- package(打包) 将编译后的代码打包成可分发格式的文件,比如JAR、WAR或者EAR文件。
- pre-integration-test(集成测试前) 在执行集成测试前进行必要的动作。比如说,搭建需要的环境。
- integration-test(集成测试) 处理和部署项目到可以运行集成测试环境中。
- post-integration-test(集成测试后) 在执行集成测试完成后进行必要的动作。比如说,清理集成测试环境。
- verify (验证) 运行任意的检查来验证项目包有效且达到质量标准。
- install(安装) 安装项目包到本地仓库,这样项目包可以用作其他本地项目的依赖。
- deploy(部署) 将最终的项目包复制到远程仓库中与其他开发者和项目共享。
说明:
当一个阶段通过 Maven 命令调用时,例如 mvn compile,只有该阶段之前以及包括该阶段在内的所有阶段会被执行。
site构建生命周期
- pre-site:执行一些需要在生成站点文档之前完成的工作
- site:生成项目的站点文档
- post-site: 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
- site-deploy:将生成的站点文档部署到特定的服务器上
Maven配置插件
- 插件与生命周期内的阶段绑定,在执行到对应生命周期时执行对应的插件功能
- 默认Maven在各个生命周期上绑定有预设的功能
- 通过插件可以自定义其他功能
<!--构建-->
<build>
<!--设置插件,可以设置多个-->
<plugins>
<!--具体的插件信息-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<configuration>
<configurationFile>src/main/resources/env/dev/generatorConfig.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
依赖管理
依赖配置
- 依赖指当前项目运行所需的jar,一个项目可以设置多个依赖
- 格式:
<!--设置当前项目锁依赖的-->
<dependencies>
<!--设置具体的依赖-->
<dependency>
<!--依赖所属群组Id-->
<groupId>junit</groupId>
<!--依赖所属项目Id-->
<artifactId>junit</artifactId>
<!--依赖版本号-->
<version>4.12</version>
</dependency>
</dependencies>
依赖传递
依赖具有传递性
- 直接依赖:在当前项目中通过依赖配置建立的依赖关系
- 间接依赖:依赖当前项目的资源的资源
依赖传递冲突
- 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低;层级越浅,优先级越高
- 声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的
- 特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的
可选依赖(不透明)
可选依赖指对外隐藏当前所依赖的资源–不透明
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<optional>true</optional>
</dependency>
排除依赖(不需要)
排除依赖指主动断开依赖的资源,被排除的资源无需指定版本–不需要
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<!--排除springboot中的log4j依赖-->
<exclusion>
<artifactId>log4j-api</artifactId>
<groupId>org.apache.logging.log4j</groupId>
</exclusion>
</exclusions>
</dependency>
依赖范围
依赖的jar默认情况可以在任何地方使用,可以通过scope标签设定其作用范围
作用范围:
- 主程序范围有效(main文件夹范围内)
- 测试程序范围有效(test文件假范围内)
- 是否参与打包(package指令范围内)
scope | 主代码 | 测试代码 | 打包 | 示例 |
---|---|---|---|---|
compile(默认) | Y | Y | Y | log4j |
test | Y | junit | ||
provided | Y | Y | servlet-api | |
runtime | Y | jdbc |
例如:
<!-- 打war包时加入此项, 告诉spring-boot tomcat相关jar包用外部的,不要打进去 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
依赖范围传递性
带有依赖范围的资源进行传递时,作用范围将受到影响
直接依赖 | compile | test | provided | runtime | |
---|---|---|---|---|---|
间接依赖 | |||||
compile | compile | test | provided | runtime | |
test | |||||
provided | |||||
runtime | runtime | test | provided | runtime |
Maven高级
分模块开发与设计
这里将我们之前一个项目拆分成若干个项目
聚合
在上面分模块开发的情况下,就可以用注入依赖的方式将拆分出来的模块当做资源注入到主项目中,从而形成一个项目,从而实现多人的分模块开发
注意:
参与聚合操作的模块最终执行顺序与模块间的依赖关系有关,和配置的顺序无关
继承
作用:通过集成可以实现在子工程中沿用父工程的配置(和java中的继承类似)
使用方式:
在子工程中声明其父工程坐标和对应的位置
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath>../../spring-boot-dependencies</relativePath>
</parent>
这样我们就可以避免在service模块和dao模块中使用相同资源的不同版本的问题了,其版本信息在父工程中统一管理起来了;各个子工程中引用父工程的artifactId,各个子工程中的version版本号可以去掉了,在父工程的pom文件中集中管理;
同理插件也可以这样管理起来。
继承的资源:
继承与聚合:
作用:
聚合用于快速构建项目
继承用于快速配置
相同点:
聚合与继承的pom.xml文件打包方式均为pom,可以将两种关系制作到同一个pom文件中
聚合与继承均属于设计模块,并无实际的模块内容
不同点:
聚合是在当前模块中配置关系,聚合可以感知到参与聚合的模块有哪些
继承是在子模块中配置关系,父模块无法感知哪些子模块继承了自己
属性
自定义属性
等同于定义变量,方便统一维护
定义格式:
<properties>
<spring.version>5.1.9.RELEASE</spring.version>
<junit.version>4.12</junit.version>
</properties>
调用格式:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
内置属性
使用Maven的内置属性,快速配置
调用格式:
${basedir}
${version}
Setting属性
使用Maven配置文件setting.xml中的标签属性,用于动态配置
调用格式:
${settings.localRepository}
Java系统属性
读取Java系统属性
调用格式:
${user.home}
系统属性查询方式:
mvn help:system #请先配置Maven的环境变量
环境变量属性
使用Maven配置文件setting.xml中的标签属性,用于动态配置
调用格式:
${env.JAVA_HOME}
环境变量属性查询方式:
mvn help:system #请先配置Maven的环境变量
工程版本
- SNAPSHOT(快照版本)
项目开发过程中,为方便团队成员合作,解决模块间相互依赖和时时更新的问题,开发者对每一个模块进行构建的时候,输出的临时版本就叫快照版本(测试阶段版本)。快照版本会随着开发的不断进展不断更新。
<groupId>org.kiwi.platform</groupId>
<artifactId>kiwi-platform-salse</artifactId>
<version>1.0-SNAPSHOT</version>
- RELEASE(发布版本)
项目发展到进入阶段里程碑后,向团队外部发布较为稳定的版本,这种版本所对应的构建文件是稳定的,即便进行功能的后续开发,也不会改变当前发布的版本内容,这种版本称为发布版本。
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
工程版本号约定
约定规范:
- <主版本>.<次版本>.<增量版本>.<里程碑版本>
- 主版本:表示项目重大架构的变更,如:spring5相较于spring4的迭代
- 次版本:表示有较大功能的增加和变化,或者全面系统的修复了漏洞
- 增量版本:表示有重大漏洞的修复
- 里程碑版本:表明一个版本的里程碑(版本内部)。这样的版本同下一个正式版本相比,相对来说不是很稳定,有待更多的测试
多环境开发
一套代码在多套环境上切换
做法:
在project根目录下定义多环境参数
<!--创建多环境-->
<profiles>
<!--具体的环境 开发环境-->
<profile>
<!--定义环境对应的唯一名称-->
<id>dev</id>
<!--设置默认启动-->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<!--环境的配置文件位置-->
<properties>
<project.env>env/dev</project.env>
</properties>
</profile>
<profile>
<id>testing</id>
<properties>
<project.env>env/test</project.env>
</properties>
</profile>
<profile>
<id>production</id>
<properties>
<project.env>env/prod</project.env>
</properties>
</profile>
<profile>
<id>staging</id>
<properties>
<project.env>env/pre</project.env>
</properties>
</profile>
</profiles>
加载指定环境:
调用格式:
mvn 指令 -p 环境定义Id # 例如:mvn install -p dev
说明:
上面的加载指定环境可以用Maven插件启动
跳过测试
该部分为了解,不建议这么做
方式一:
使用界面操作跳过测试
方式二:
使用配置跳过
<!--配置跳过测试-->
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<configuration>
<!--设置跳过测试(全部跳过)-->
<skipTests>true</skipTests>
<!--
<includes>
包含指定用例
<include>**/User>Test.java</include>
</includes>
-->
<!--
<excludes>
排除指定用例
<exclude></exclude>
</excludes>
-->
</configuration>
</plugin>
方式三:
使用命令跳过测试
mvn 指令 -D skipTests #执行的指令生命周期中必须包含测试环节
私服
私服的定义:
maven的仓库分为本地仓库,远程仓库和私服仓库。
私服仓库一般是公司内部私有的,内部进行维护的。公司员工连接私服,从私服中下载jar,或者将自身的jar传到私服上。私服还可以从中央仓库下载jar,当私服中没用jar的时候,就会从中央仓库下载
Nexus的安装略
仓库的分类:
- 宿主仓库
保存无法从中央仓库获取的资源,一般为自主研发或者第三方非开源项目 - 代理仓库proxy
代理远程仓库,通过nexus访问其他公共仓库,例如中央仓库 - 仓库组group
将若干个仓库组建成一个群组,简化配置;仓库组是设计型仓库,不能保存资源
idea中资源的上传与下载:
- 在maven的setting.xml中配置
<servers>
<server>
<id>rdc-releases</id>
<username>私服的账号</username>
<password>私服的密码</password>
</server>
<server>
<id>rdc-snapshots</id>
<username>私服的账号</username>
<password>私服的密码</password>
</server>
</servers>
- 配置项目的pom文件中配置(一般放在父工程中)
<distributionManagement>
<repository>
<id>rdc-releases</id>
<!--私服地址 发布版本仓库--><url>http://localhost:8081/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>rdc-snapshots</id>
<!--私服地址 快照仓库--><url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
这样就可以在IDEA上进行操作了
发布资源到私服的命令:
mvn deploy
至此,Maven相关知识整理完毕。