Maven是apache旗下的一个开源项目,是一款用于管理和构建java项目的工具
Maven的作用
1.依赖管理:方便快捷的管理项目依赖资源(jar包),避免版本冲突问题
我们有的项目需要大量的jar包,采用手动导包的方式非常繁琐,并且版本升级也不方便。当我们使用maven,只要创建maven工程,只需要在pom.xml配置文件中配置即可。
2.统一项目结构:提供标准,统一的项目结构
我们程序员使用的开发工具很多,但构建出来的项目目录结构有差异,使用Maven提供了标准的项目结构,这样不同开发工具开发的项目之间可以相互导入
pom.xml是maven的核心依赖,当前项目要导入的核心依赖都在里面
3.项目构建:提供便准跨平台的自动化项目构建方式
我们可以通过里面的指令快速完成清理,编译,测试打包等工作
Maven模型
各个插件就可以完成各种功能例如编译插件进行编译,打包阶段进行打包,而每部操作都会产生对应的文件,放在target目录下
项目对象模型是指在pom.xml文件中通过一小段配置信息来 描述这个工程,如下图标明了项目的组织,模块名称,版本。他们称为工程的坐标
当我们要关联jar包,就可以在xml文件当中添加依赖管理模型。在xml文件中用标签添加依赖
添加依赖之后,maven会自动到仓库查找依赖。首先到本地仓库查找,如果本地仓库没有,会连接中央仓库的jar包,下载到本地仓库。为了提高加载速度,还会引用公司自己搭建的仓库(私服),只要公司中有一个人用到了依赖,就会把依赖下载到私服中
仓库:是用于存储资源,管理各种jar包的
Maven安装
1.下载地址:Maven – Download Apache Maven
bin目录存放的是可执行文件,conf目录存放的是配置文件,lib里是存放的jar包资源
2.配置本地仓库:配置一个地址作为本地仓库用来存储下载的jar包资源
方法:修改conf/setting.xml中的<localRepsitory>为一个指定目录
3.配置私服:修改conf/settings.xml中的<mirrors>标签,为其添加如下子标签
4.配置环境变量:MAVEN_HOME为maven的解压目录,并将其bin目录加入PATH环境变量。
IDEA集成maven
配置maven环境
- 配置当前工程的maven环境
配置安装路径,xml文件和本地仓库
关联的jre是否是对应的版本
和配置java语言的字节码版本
- 配置全局maven环境工程
在主界面配置即可
IDEA创建maven项目
1.创建项目,选择maven Archetype,并修改 Archetype的值
2.填写坐标信息
坐标是资源的唯一标识,通过坐标可以定义资源的唯一位置
使用坐标来定义项目或引入项目中需要的依赖
导入maven项目
方式一:打开IDEA,选择右侧Maven面板,点击+号,选中对应项目的pom.xml文件,双击即可。
如果点没有弹出对话框,点击Apperance勾选进行调出
方式二:模块中导入pom文件
依赖管理
依赖配置
依赖:指当前项目运行所需要的jar包,一个项目中可以引入多个依赖。
配置:
1. 在pom.xml中编写<dependencies>标签2. 在<dependencies>标签中 使用<dependency>引入坐标
3. 定义坐标的 groupld, artifactid, version
4. 点击刷新按钮,引入最新加入的坐标
第一次使用依赖可能未下载,需要点击刷新按钮刷新联网下载依赖
如果不知道依赖的坐标信息,可以到https://mvnrepository.com/中搜索。
依赖传递
依赖具有传递性,被依赖的资源如果依赖了其他资源,那么依赖的依赖也会导入
排除依赖
排除依赖指主动断开依赖的资源,被排除的资源无需指定版本。
依赖范围
依赖的jar包,默认情况下,可以在任何地方使用。可以通过<scope> ...< / scope>设置其作用范围
作用范围:
主程序范围有效。(main文件夹范围内)
测试程序范围有效。(test文件夹范围内)
是否参与打包运行。(package指令范围内)
生命周期
Maven中有3套相互独立的生命周期:
clean: 清理工作。
default:核心工作,如:编译、测试、打包、安装、部署等。
site:生成报告、发布站点等。
每套生命周期包含一些阶段(phase),阶段是有顺序的,后面的阶段依赖于前面的阶段。
lifecycle就是生命阶段。
我们来讲几个重要的生命阶段:
clean:移除上一次构建生成的文件
compile:编译项目源代码
test:使用合适的单元测试框架运行测试(junit)
package:将编译后的文件打包,如:jar、war等
install:安装项目到本地仓库
执行指定生命周期的方式:
在idea中,右侧的maven工具栏,选中对应的生命周期,双击执行。
分模块设计
没分模块:不便维护,组件难以复用。于是便可以将项目进行分模块设计。
将项目按照功能拆分成若干个子模块,方便项目的维护,扩展,模块间的相互调用,资源共享。
模块继承
防止多模块之间引入同一依赖的繁琐问题,可以使用Maven的继承解决。
我们发现所有的SpringBoot工程都有一个统一的父工程 Spring-Boot-strart-parent。
Maven当中一个工程只能继承一个父工程。但是所有的SpringBoot项目都继承一个默认的父工程,那我们如何实现继承呢?使用多重继承,也就是只需要父工程继承默认工程,子工程继承复工程。
1.创建一个父工程模块,通过packaging标签 设置打包方式为pom。
- jar:普通模块打包,springboot项目基本都是jar包(内嵌tomcat运行)
- war:普通web程序打包,需要部署在外部的tomcat服务器中运行(Servelet,SpringMVC)
- pom:父工程或聚合工程,该模块不写代码,仅进行依赖管理
2.让子工程继承父工程,并将子工程共有的依赖引入在父工程当中,实现依赖的继承。同时在子工程的pom.xml文件中,通过relativePath标签来配置继承关系。配置父工程pom文件的相对路径。
实现:<parent>...<parent>指定父工程坐标
注意:
- 在子工程中,配置了继承关系之后,坐标中的groupId是可以省略的,因为会自动继承父工程的。
- 若父工程和子工程都配置了同一个依赖的不同版本,以子工程的为准
版本锁定
在maven中,可以在父工程pom文件通过<dependencyManagement>来统一管理依赖版本。这样子工程引入依赖时,无需指定<version>版本号,父工程同一管理。变更依赖版本,只需在父工程中统一变更。
maven自定义属性功能:为了能够统一管理引入的版本号,可以通过自定义属性的方法来引入。
通过<properties>标签来定义属性
在依赖的<version>标签中通过${}占位符来进行绑定。
聚合
聚合是将多个多个模块组织成一个整体,同时进行项目的构建。
我们需要先将项目依赖的模块以及父工程先install,来往maven的本地仓库中安装jar包,这样在项目打包时才能在本地仓库中找到要依赖的jar包。这样很繁琐,能通过聚合来进行简化。
需要一个聚合工程:聚合工程是一个不具有业务功能的"空工程"(有且只有一个pom文件)。
注意:通常父工程也是聚合工程。聚合工程中所包含的模块,在构建时,会自动根据模块间的依赖关系设置构建顺序,与聚合工程中模块的配置书写位置无关。
可以通过maven中通过<modules>设置当前聚合工程包含模块。
作用
- 聚合用于快速构建项目
- 用于简化依赖配置、统一管理依赖
相同点:
- 聚合与继承的pom.xm1文件打包方式均为pom,可以将两种关系制作到同一个pom文件中
- 聚合与继承均属于设计型模块,并无实际的模块内容
不同点:
- 聚合是在聚合工程中配置关系,聚合可以感知到参与聚合的模块有哪些
- 继承是在子模块中配置关系,父模块无法感知哪些子模块继承了自己
私服
资源上传与下载
首先将jar包安装到本地仓库中,然后执行deploy把本地仓库的资源发布到私服仓库当中。
项目中要指定仓库的url地址。访问私服的用户名和密码。
私服当中有很多仓库,有一个中央仓库,relase,snapshot。
项目版本:
- RELEASE(发行版本):功能趋于稳定、当前更新停止,可以用于发行的版本,存储在私服中的RELEASE仓库中。
- SNAPSHOT(快照版本):功能不稳定、尚处于开发中的版本,即快照版本,存储在私服的SNAPSHOT仓库中。
1.设置私服的访问用户名和密码(maven配置文件settings.xml中的servers中配置)
2.IDEA的maven工程的pom文件中配置上传地址,在聚合工程中进行配置即可
3.设置私服依赖下载的仓库组地址(settings.xml中的mirrors),如果配置过阿里云,需要直接替换掉
4.profile中的配置 ,指定这两个版本都能从配置的仓库组中下载,因为默认情况下不稳定的版本不允许从私服中下载。
5.执行deploy生命周期