Maven
Maven简介
学maven首先记住一句话,约定大于配置
Maven是什么
- 本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(pom)
- POM(Project Object Model):项目对象模型
- pom.xml—>项目管理模型------>依赖管理(Dependency)—>本地仓库—>私服仓库—>中央
Maven有什么用
- 项目构建:提供标准化,跨平台的自动化项目构建方式
- 依赖管理:方便快捷的管理项目依赖的资源包,避免资源间的版本冲突问题
- 统一开发结构:提供标准的,统一的项目结构
下载与安装
- 官网:http://maven.apache.org/
- 下载地址:http://maven.apache.org/download.cgi
Maven环境配置
- 依赖java,所以需要JAVA_HOME
- 设置Maven自身的运行环境,需要配置MAVEN_HOME
Maven基础概要
仓库
仓库:用于存储资源,包含各种jar包
- 仓库分类
- 本地仓库:自己电脑上的存储资源的仓库,连接远程仓库获取资源
- 远程仓库:非本机上的仓库,为本地仓库提供资源
- 中央仓库:由Maven团队维护,存储所有开源资源的仓库
- 私服:部门/公司范围内存储资源的仓库,从中央仓库中获取资源
- 私服的作用
- 保护具有版权的资源,包含购买或者自主研发的jar
- 中央仓库中的jar都是开源的,不能存储具有版权的资源
- 一定范围内共享资源,就对内开放,不对外开放
- 保护具有版权的资源,包含购买或者自主研发的jar
坐标GAV
-
坐标:Maven中的坐标主要用于描述仓库中资源的位置,记住这个网站
- https://mvnrepository.com/
-
Maven主要组成部分
- groupId:定义当前项目隶属的组织名称(通常是域名反写 例如com.zhima)
- artifactId:定义该项目的项目名称(通常是模块名称)
- version:定义当前项目的版本号
- packaging:定义该项目的打包方式
-
作用:使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别与下载工作交由机器完成
本地仓库配置
maven默认的本地仓库目录在c盘用户文件夹下的.m2文件夹中,如有需要,可在配置文件中自行配置。
在这里举个例子,我需要将D:\APP\Maven\mvn-repo
该目录作为我的maven本地仓库的路径。
- 创建mvn-repo文件夹,在此文件夹中创建repository目录
- 在maven安装根目录下的config文件夹下找到settings.xml找到以下配置所在,照着以下配置修改
//这里改成自己需要配置的仓库目录
<localRepository>D:\APP\Maven\mvn-repo\repository</localRepository>
//阿里云的镜像服务器,会加快jar包的下载速度,直接复制即可
<mirrors>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirrors>
- 将此份配置文件保存并复制到mvn-repo文件夹中
全局setting(maven的config中的setting文件)和用户setting(尽量和全局setting一样)区别
- 全局setting定义了当前计算机中Maven的公共配置
- 用户setting定义了当前用户的配置
创建maven项目
手工(用的很少,一般都是直接使用idea创建)
普通maven工程
mvn archetype:generate
-DgroupId = com.zhima
-DartifactId = project
-DarchetypeArtifactId = maven-archetype-quickstart
-Dversion = 0.0.1-snapshot
-DinteractiveMode = false
web工程
mvn archetype:generate
-DgroupId = com.zhima
-DartifactId = project
-DarchetypeArtifactId = maven-archetype-webapp
-Dversion = 0.0.1-snapshot
-DinteractiveMode = false
依赖管理
依赖配置
<!--设置当前项目所需要的依赖-->
<dependencies>
<!--设置具体的依赖-->
<dependency>
<!--依赖所属的群组id-->
<groupId>junit</groupId>
<!--依赖所属的项目id-->
<artifactId>junit</artifactId>
<!--依赖的版本号-->
<version>4.13</version>
</dependency>
</dependencies>
依赖传递
依赖具有传递性
- 直接传递:在当前项目中,通过依赖配置建立的依赖关系
- 间接关系:被依赖的资源如果依赖其他的资源,当前项目间接依赖其他项目
依赖冲突
- 路径优先:当依赖中出现相同的资源时,层次越深,优先级越低,层次越浅,优先级越高
- 声明优先:当资源在相同层次被依赖时,配置顺序靠前的覆盖顺序靠后的
- 特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的
可选依赖(主动表示断开)
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<!--不透明-->
<optional>true</optional>
</dependency>
</dependencies>
排除依赖(主动断开)
排除依赖指的是主动断开依赖的资源,被排除的资源无需指定版本—不需要
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<exclusions>
<exclusion>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
依赖范围
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
</dependencies
- 依赖的jar包默认情况下可以在任何地方使用,可以通过scope标签设定起作用范围
- 作用范围
- 主程序范围有效(main文件范围内)
- 测试范围有效(test文件夹范围)
- 是否参与打包(package指令范围内)
scope | 主代码 | 测试代码 | 打包 | 示例 |
---|---|---|---|---|
compile | Y | Y | Y | log4j |
test | Y | junit | ||
provided | Y | Y | servlet-api | |
runtime | Y | jdbc |
依赖范围的传递性
- 带有依赖范围的资源在进行传递的时候,作用范围将会受到影响
行是直接依赖,列是间接依赖 | compile | test | provided | runtime |
---|---|---|---|---|
compile | compile | test | provided | runtime |
test | ||||
provided | ||||
runtime | runtime | test | provided | runtime |
生命周期以及插件
生命周期
- Maven对项目构建的生命周期划分为3套
- clean:清理工作
- default:核心工作,例如编译、测试、打包、部署等
- site:产生报告,发布站点等
clean生命周期
- pre-clean 执行一些需要在clean之前立即完成的工作
- clean 移除所有上一次构件生成的文件
- post-clean 执行一些需要在clean之后立即完成的工作
default生命周期
site生命周期
- pre-site 执行一些需要在生成站点文档之前完成的工作
- site 生成站点文档
- post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备工作
- site-deploy 将生成的站点文档部署到特定服务器上面去
插件
- 插件与生命周期内的阶段绑定,在执行到对应生命周期时执行对应的插件功能
- 默认maven在各个生命周期上绑定有预设的功能
- 通过插件可以自定义其他功能