1.1 简介
概念:Maven 的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POW);
- Maven是用 Java 语言编写的。他管理的东西统统以面向对象的形式进行设计,最终他把一个项目看成一个对象,而这个对象叫做POM(project object model),即项目对象模型;
- Maven 的作用有三个:
- 项目构建:提供标准的,跨平台的自动化构建项目的方式;
- 依赖管理:方便快捷的管理项目依赖的资源(jar包),避免资源间的版本冲突等问题;
- 统一开发结构:提供标准的,统一的项目开发结构;
1.2 仓库
概念:Maven 仓库是项目中依赖的第三方库,这个库所在的位置叫做仓库,用于存储各种资源,包含各种 jar 包;
Maven 仓库有三种类型:
- 本地仓库:本地仓库是自己电脑上存储资源的仓库,在第一次执行 maven 命令的时候被创建,Maven 所需要的构建是直接从本地仓库进行获取的,如果本地仓库没有,它会连接远程仓库获取资源下载至本地仓库;
- 中央仓库:中央仓库是由 Maven 社区提供的仓库,其中包含了大量常用的库,中央仓库包含了绝大多数的开源 Java 构件(不能存储具有版权的资源),由 Maven 团队维护,需要网络才能访问;
- 私服: 部门或公司范围内存储资源的仓库,用于保存购买的、自主研发的 jar ,仅对内部开放,不对外部开放;
1.3 坐标
概念:Maven 坐标用于描述仓库中资源的位置;
组成:
- 组织 ID ( groupId ):定义当前 Maven 项目隶属组织名称(通常是域名反写,例如:org.mybatis );
- 项目 ID ( artifactId ):定义当前 Maven 项目名称;
- 版本号(version):定义当前项目版本号;
作用:坐标是唯一标识,用于唯一位置定位;
资源坐标查询网站:https://mvnrepository.com/
1.4 基本项目构建命令
- Maven 构建命令使用 mvn 开头,后面添加功能参数,可以用空格分隔一次性执行多个命令:
//编译 mvn compile //清理 mvn clean //测试 mvn test //打包 mvn package //安装到本地仓库 mvn install
1.5 pom 文件
常用标签:
- dependencies:设置当前项目所依赖的所有 jar;
- dependency:设置具体的依赖;
- optional:可选依赖;
- exclusions:排除依赖;
- scope:依赖范围;
- groupId:所属的项目包;
- artifactId:所属项目 id ;
- packaging:打包格式( java 项目为 jar ,web 项目为 war );
- version:版本号;
- build:配置;
- plugins:设置当前项目所依赖的所有插件;
- plugin:设置具体的插件;
- configuration:设置当前插件的配置、构造;
- port:端口号;
- path:路径;
示例:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><!-- 当前 pom 版本号 --><modelVersion>4.0.0</modelVersion><!-- 项目包名 --><groupId>com.caterpillar</groupId><!-- 项目名称 --><artifactId>web01</artifactId><!-- 打包格式 --><packaging>war</packaging><!-- 项目版本号 --><version>1.0-SNAPSHOT</version><!-- maven名称 --><name>web01 Maven Webapp</name><!-- maven坐标 --><url>http://maven.apache.org</url><!-- 所有依赖 --><dependencies><!-- 具体依赖 --><dependency><!-- 依赖包名 --><groupId>junit</groupId><!-- 依赖名称 --><artifactId>junit</artifactId><!-- 依赖版本 --><version>4.12</version><!-- 可选依赖 --><optional>true</optional><!-- 依赖范围 --><scope>test</scope></dependency><dependency><groupId>com.caterpillar</groupId><artifactId>java01</artifactId><version>1.0-SNAPSHOT</version><!-- 所有需去除依赖 --><exclusions><!-- 具体需去除依赖 --><exclusion><groupId>junit</groupId><artifactId>junit</artifactId></exclusion></exclusions></dependency></dependencies><!-- 配置 --><build><!-- 所有插件 --><plugins><!-- 具体插件 --><plugin><!-- 插件包名 --><groupId>org.apache.tomcat.maven</groupId><!-- 插件名称 --><artifactId>tomcat7-maven-plugin</artifactId><!-- 插件版本 --><version>2.1</version><!-- 构造 --><configuration><!-- 端口 --><port>80</port><!-- 路径 --><path>/</path></configuration></plugin></plugins></build> </project>
依赖:
- 传递性:
- 在当前项目中通过 pom 文件建立的依赖关系叫做直接依赖;
- 在当前项目的依赖中依赖其他项目,会继承被依赖项目的依赖;
- 依赖传递冲突问题:
在依赖传递的情况下,出现依赖同一个名称但实际不为同一资源时称为依赖传递冲突问题;
依赖的优先级:
- 路径优先:层级越深,优先级越低,层级越浅优先级越高;
- 声明优先:配置顺序靠前的覆盖配置顺序靠后的;
- 特殊优先:为相同资源的不同版本情况下后配置的覆盖先配置的;
- 依赖范围
依赖的 jar 默认情况下可以在任何情况下使用,可以使用 scope 标签设定其作用范围;
scope | 主代码 | 测试代码 | 打包 |
---|---|---|---|
compile(默认) | 可用 | 可用 | 可用 |
test | 不可用 | 可用 | 不可用 |
provided | 可用 | 可用 | 不可用 |
runtime | 不可用 | 不可用 | 可用 |
1.6 生命周期
maven 对项目构建的生命周期分为 3 套:
- clean:清理工作
- pre-clean:执行一些需要在 clean 之前完成的工作;
- clean:移除上一次构建所生成的文件;
- post-clean:执行一些需要在 clean 之后执行的工作;
- defaule:核心工作
主要有:
- compile:编译
- test-compile:编译测试源码
- test:测试
- package:打包
- install:安装
- site:产生报告
- pre-site:执行一些要在生成站点文档之前完成的工作;
- site:生成项目的站点文档;
- post-site:执行一些在站点文档之后完成的工作,并且为部署做准备;
- site-deploy:将生成的站点文档部署到特定的服务器上;