Maven
Maven简介
Maven是什么
Maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)
POM(Porject Object Model):项目对象模型
Maven的作用
项目构建:提供标准的、跨平台的自动化项目构建方式
依赖管理:方便快捷的管理项目依赖的资源(jar包),避免资源间的版本冲突问题。
统一开发结构:提供标准的、统一的项目结构。
Maven的基础概念
1.仓库
仓库:用于存储资源,各种jar包。
仓库分类:
- 本地仓库:自己电脑上存储资源的仓库,链接远程仓库获取资源。
- 远程仓库:
- 中央仓库:Maven团队维护,存储所有资源的仓库。
- 私服:部门/公司范围内存储资源的仓库,从中央仓库获取资源。
私服的作用:
- 保护具有版权的资源,包含购买或自主研发的jar
- 中央仓库中的jar都是开源的,不能存储具有版权的资源。
- 一定范围内共享资源,仅对内部开放,不对外共享。
2.坐标
什么是坐标?
Maven中的坐标用于描述仓库中资源的位置。
Maven坐标的组成
- groupId:定义当前Maven项目隶属组织名称(通常是域名反写)。
- artifactld:定义当前Maven项目名称(通常是模块名称)。
- version:定义当前项目版本号。
Maven坐标的作用
唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别与下载工作交由机器完成。
Maven的下载和配置
1、官网地址
Maven官网地址:https://maven.apache.org/
Maven下载地址:https://maven.apache.org/download.cgi
2、下载安装
下载完成后解压到没有中文字符和空格的目录中(最好别安装到C盘中):
在解压目录中,我们需要着重关注 Maven 的核心配置文件:conf/settings.xml
3、指定本地仓库
本地仓库默认值:用户家目录/.m2/repository。由于本地仓库的默认位置是在用户的家目录下,而家目录往往是在 C 盘,也就是系统盘。将来 Maven 仓库中 jar 包越来越多,仓库体积越来越大,可能会拖慢 C 盘运行速度,影响系统性能。所以建议将 Maven 的本地仓库放在其他盘符下。配置方式如下:
- 打开conf目录中的settings.xml文件
- 在不是c盘中的一个地方新建一个空目录,把路径复制到
<localRepository>
标签中
记住:一定要把 localRepository 标签从注释中拿出来。
注意:本地仓库本身也需要使用一个非中文、没有空格的目录。
4、配置阿里云提供的镜像仓库
Maven 下载 jar 包默认访问境外的中央仓库,而国外网站速度很慢。改成阿里云提供的镜像仓库,访问国内网站,可以让 Maven 下载 jar 包的时候速度更快。配置的方式是:
将原来的配置注释掉:
1 | <!-- |
加入新的配置
1 | <!--配置阿里云镜像仓库--> |
5、配置 Maven 工程的基础 JDK 版本
如果按照默认配置运行,Java 工程使用的默认 JDK 版本是 1.5,而我们熟悉和常用的是 JDK 1.8 版本。修改配置的方式是:将 profile 标签整个复制到 settings.xml 文件的 profiles
标签内。
1 | <profile> |
6、检查 JAVA_HOME 配置是否正确
Maven 是一个用 Java 语言开发的程序,它必须基于 JDK 来运行,需要通过 JAVA_HOME 来找到 JDK 的安装位置。
可以用一下命令验证:WIN+R
,输入cmd打开界面
1 | C:\Users\chen>echo %JAVA_HOME% |
7、配置MAVEN_HOME和PATH
新建系统变量,把maven的安装目录复制进去,变量名填MAVEN_HOME
编辑Path配置,新增%MAVEN_HOME%\bin
配置
8、验证
1 | C:\Users\chen>mvn -v |
Maven项目构建命令
Maven构建命令使用mvn开头,后面添加功能参数,可以一次执行多个命令,使用空格分隔。
1 | mvn compile #编译 |
1.编译操作
主程序编译:mvn compile
测试程序编译:mvn test-compile
主体程序编译结果存放的目录:target/classes
测试程序编译结果存放的目录:target/test-classes
2.清理操作
1 | mvn clean |
效果:删除target目录
3.测试操作
1 | mvn test |
测试的报告存放的目录:target/surefire-reports
4.打包操作
1 | mvn package |
打包的结果—jar包,存放的目录:target
5.安装操作
1 | mvn install |
安装的效果是将本地构建过程中生成的 jar 包存入 Maven 本地仓库。这个 jar 包在 Maven 仓库中的路径是根据它的坐标生成的。
另外,安装操作还会将 pom.xml 文件转换为 XXX.pom 文件一起存入本地仓库。所以我们在 Maven 的本地仓库中想看一个 jar 包原始的 pom.xml 文件时,查看对应 XXX.pom 文件即可,它们是名字发生了改变,本质上是同一个文件。
清除在本地仓库的安装。
1 | mvn clean install |
第一个Maven项目
使用插件创建工程
1 | mvn archetype:generate |
创建Java工程
1 | mvn archetype:generate -DgroupId=com.itheima -DartifactId=java-project -DarchetypeArtifactId=maven-archetype-quickstart -Dversion=0.0.1-snapshot -DinteractiveMode=false |
创建Web工程
1 | mvn archetype:generate -DgroupId=com.itheima -DartifactId=web-project -DarchetypeArtifactId=maven-archetype-webapp -Dversion=0.0.1-snapshot -DinteractiveMode=false |
pom.xml解读
1 |
|
依赖管理
1.依赖配置
依赖指当前项目运行所需要的jar,一个项目可以设置多个依赖
格式:
1 | <!--设置当前项目所依赖的所有jar--> |
2.依赖传递
依赖具有传递性(相对概念)
- 直接依赖:在当前项目中通过依赖配置建立的依赖关系。
- 间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源。
依赖传递中的冲突问题
- 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高。
- 声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的。
- 特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的。
3.可选依赖
可选依赖指对外隐藏当前所依赖的资源——不透明。
1 | <dependency> |
true
控制资源不被别人看到。
4.排除依赖
排除依赖指主动断开依赖的资源,被排除的资源无需指定版本——不需要。
1 | <dependeney> |
org.hamcrest
hamcrest-core
主动断开间接依赖的资源。
5. 依赖范围
依赖的jar默认情况可以在任何地方使用,通过scope
标签设定其作用范围
作用范围
- 主程序范围有效(main文件夹范围内)
- 测试程序范围有效(test文件夹范围内)
- 是否参与打包(package指令范围内)
5.1 依赖范围的传递性(了解)
带有依赖范围的资源在进行传递时,作用范围将受到影响
生命周期与插件
1. 项目构建生命周期
Maven构建生命周期描述的是一次构建过程经历了多少个事件。
compile——>test-compile——>test——>package——>install
Maven对项目构建的生命周期划分为三套。
- clean:清理工作
- default:核心工作,例如编译,测试,打包,部署等
- site:产生报告,发布站点等
1.1 clean生命周期
- pre-clean:执行一些需要在clean之前完成的工作
- clean:移除所有上一次构建生成的文件
- post-clean:执行一些需要在clean之后完成的工作
1.2 default生命周期
1.3 site构建生命周期
- pre-site:执行一些需要生成站点文档之前完成的工作
- site:生成项目的站点文档
- post-site:执行一些需要生成站点文档之后完成的工作,并为部署做准备
- site-deploy:将生成的站点文档部署到特定的服务器上
2. 插件
- 插件与生命周期内的阶段绑定,在执行到对应的生命周期时执行对应的插件功能
- 默认maven在各个生命周期上绑定有预设的功能
- 通过插件可以自定义其他功能
1 | <build> |
分模块开发与设计
1.聚合
作用:聚合用于快速构建maven工程,一次性构建多个项目/模块。
新建一个工程ssm管理其他四个工程。
- 创建一个空模块,打包类型为pom
- 定义当前模块进行构建操作时关联的其他模块的名称。
1 |
|
2.继承
作用:通过继承可以实现在子工程中沿用父工程中的配置。
- maven中的继承与java中的继承相似,在子工程中配置继承关系。
在子工程中声明其父工程坐标与其对应位置。
1 | <!--定义该工程的父工程--> |
在父工程中定义依赖管理
1 | <!--声明此处进行依赖管理--> |
在子工程定义依赖关系,无需声明依赖版本,版本参照父工程中依赖的版本(版本由父工程进行控制)。
1 | <dependencies> |
可继承的资源
2.1 继承与聚合
作用:
- 聚合用于快速构建项目。
- 继承用于快速配置。
相同点:
- 聚合与继承的pom.xml文件打包方式均为
pom
,可以将两种关系制作到同一个pom文件中。 - 聚合与继承均属于设计型模块,并无实际的模块内容。
不同点:
- 聚合是在当前模块中配置关系,聚合可以感知到参与聚合的模块有哪些。
- 继承是在子模块中配置关系,父模块无法感知那些子模块继承自己。
3.属性
属性类别
- 自定义属性
- 内置属性
- Setting属性
- Java系统属性
- 环境变量属性
3.1 自定义属性
作用:等同于定义变量,方便统一维护。
定义格式:
1 | <!--定义自定义属性--> |
调用格式:
1 | <dependency> |
3.2 内置属性
作用:使用maven内置属性快速配置
调用格式:
1 | ${basedir} |
3.3 Setting属性
作用:使用Maven配置文件setting.xml中的标签属性,用于动态配置。
调用格式:
1 | ${settings.localRepository} |
3.4 Java的系统属性
作用:读取Java系统属性
调用格式:
1 | ${user.home} |
系统属性查询方式:
1 | mvn help:system |
3.5 环境变量属性
作用:读取环境变量属性
调用格式:
1 | ${env.JAVA_HOME} |
系统属性查询方式:
1 | mvn help:system |
版本管理
SNAPSHOT(快照版本)
- 项目开发过程中,为方便团队成员合作,解决模块间相互依赖和时时更新的问题,开发者对每个模块进行构建的时候,输出的临时性版本叫快照版本(测试阶段版本)
- 快照版本会随着开发的进展不断更新
RELEASE(发布版本)
- 项目开发到进入阶段里程碑后,向团队外部发布较为稳定的版本,这种版本所对应的构件文件是稳定的,即便进行功能的后续开发,也不会改变当前发布版本内容,这种版本称为发布版本
资源配置
作用
在任意配置文件中加载pom文件中定义的属性
调用格式
1
${jdbc.url}
开启配置文件加载pom属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18<build>
<!--配置资源文件对应的信息-->
<resources>
<resource>
<!--设定配置文件对应位置的目录,支持使用属性动态设计路径-->
<directory>${project.basedir}/src/main/resources</directory>
<!--开启配置文件的资源加载过滤-->
<filtering>true</filtering>
</resource>
</resources>
<!--配置测试资源文件对应的信息-->
<testResources>
<testResource>
<directory>${project.basedir}/src/test/resources</directory>
<filtering>true</filtering>
</testResource>
</testResources>
</build>
示例:
pom.xml
1 | <properties> |
jdbc.properties
1 | jdbc.driver=com.mysql .jdbc.Driver |
多环境开发配置
1 | <!--创建多环境--> |
加载指定环境
调用格式
1 | mvn 指令 -P 环境定义ID |
范例
1 | mvn install -P pro_env |
跳过测试(了解)
使用命令
1
mvn install -D skipTests
使用界面操作
使用配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<plugin>
<artifactId>maven-surefire-plugin</artifactid>
<version>2.22.1</version>
<configuration>
<skipTests>true</skipTests>
<!--设置跳过测试-->
<includes>
<!--包含指定的测试用例-->
<include>**/User*Test.java</include>
</includes>
<excludes>
<!--排除指定的测试用例-->
<exclude>**/User*Testcase.java</exclude>
</excludes>
</configuration>
</plugin>
私服
1. 分模块开发
2. Nexus
- Nexus是Sonatype公司的一款私服产品
- 下载地址: https://help.sonatype.com/repomanager3/download
Nexus安装,启动与配置
- 启动服务器
1 | nexus.exe /run nexus |
- 访问服务器
1 | http://localhost:8081 |
修改基础配置信息
安装路径下etc目录中
nexus-default.properties
文件保存有nexus基础配置信息,例如访问默认端口。修改服务器运行配置信息
安装路径下bin目录中
nexus.vmoptions
文件保存有nexus服务器启动对应的配置信息,例如默认占用内存空间。
3. 私服资源的获取
仓库分类
- 宿主仓库hosted。
- 保存无法从中央仓库获取的资源。
- 自主研发。
- 第三方非开源项目。
- 保存无法从中央仓库获取的资源。
- 代理仓库proxy
- 代理远程仓库,通过nexus访问其他公共仓库,例如中央仓库。
- 仓库组group
- 将若干个仓库组成一个群组,简化配置。
- 仓库组不能保存资源,属于设计型仓库。
4. IDEA环境中资源的上传和下载
4.1 本地仓库访问私服的权限(setting.xml)
配置本地仓库访问私服的权限
1 | <servers> |
配置本地仓库的资源来源
1 | <mirrors> |
4.2 访问私服配置
配置当前项目访问私服上传资源的保存位置(pom.xml)
1 | <!--发布配置管理--> |
发布资源命令
1 | mvn deploy |