Maven简介
摘自百度百科:Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。也就是说maven是一个项目构建工具,可以对java项目进行构建,依赖管理,也可以用于各种项目的构建和管理。
maven的功能主要有:构建项目,文档生成,报告生成,依赖管理,SCMs(SCMS-T是一种著作权保护技术,叫串行拷贝管理系统。全称是Serial Copy Management System。),发布项目,分发,邮件列表等。
Maven这个单词来自于意第绪语(犹太语),意为知识的积累,最初在Jakata Turbine项目中用来简化构建过程。当时有一些项目(有各自Ant build文件),仅有细微的差别,而JAR文件都由CVS来维护。于是希望有一种标准化的方式构建项目,一个清晰的方式定义项目的组成,一个容易的方式发布项目的信息,以及一种简单的方式在多个项目中共享JARs。这就是maven存在的意义。
一、约定配置
Maven 提倡使用一个共同的标准目录结构,Maven 使用约定优于配置的原则,有统一的目录结构。
目录 | 目的 |
---|---|
${basedir} | 存放pom.xml和所有的子目录 |
${basedir}/src/main/java | 项目的java源代码 |
${basedir}/src/main/resources | 项目的资源,比如说property文件,springmvc.xml |
${basedir}/src/test/java | 项目的测试类,比如说Junit代码 |
${basedir}/src/test/resources | 测试用的资源 |
${basedir}/src/main/webapp/WEB-INF | web应用文件目录,web项目的信息,比如存放web.xml、本地图片、jsp视图页面 |
${basedir}/target | 打包输出目录 |
${basedir}/target/classes | 编译输出目录 |
${basedir}/target/test-classes | 测试编译输出目录 |
Test.java | Maven只会自动运行符合该命名规则的测试类 |
~/.m2/repository | Maven默认的本地仓库目录位置 |
一般web 项目的maven目录结构如下图:
src目录:表示项目源码
pom.xml:表示maven的配置文件,每个maven项目必须有这个配置文件。
src目录下主要有两个目录:
--main目录
--java 放置java源代码
--resources 放置各种项目配置文件
--webapp 放置页面素材文件等
--test目录
--java 放置测试源代码
--resources 放置测试所需的配置文件。
springboot项目,maven的目录结构如下:
src目录:表示项目源码
pom.xml:表示maven的配置文件,每个maven项目必须有这个配置文件。
src目录下主要有两个目录:
--main目录
--java 放置java源代码
--resources 放置各种项目配置文件
--test目录
--java 放置测试源代码
target目录主要是用于存放项目编译生成的字节码文件。
二、Maven POM
POM( Project Object Model,项目对象模型 ) 是 Maven 工程的基本工作单元,是一个XML文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。
执行任务或目标时,Maven 会在当前目录中查找 POM。它读取 POM,获取所需的配置信息,然后执行目标。
POM中可以指定以下配置:项目依赖,插件,执行目标,项目构建profile,项目版本,项目开发者列表,相关邮件列表信息。
详情参考菜鸟教程:https://www.runoob.com/maven/maven-pom.html
三、Maven项目构建过程
Maven 构建生命周期定义了一个项目从构建到发布的过程。
项目构建:指的是项目从编译-----测试------打包-----安装-----部署 整个过程都交给maven进行管理,这个过程称为构建。
maven通过一键构建将项目整个开发流程都给囊括了,从编译到部署整个过程都可以交给maven进行管理。如下图:
每一个阶段都通过一个命令来完成。
主要就是这几个命令:
一个典型的Maven构建(build)生命周期是由以下几个阶段的序列组成的:
阶段 | 处理 | 描述 |
---|---|---|
验证 validate | 验证项目 | 验证项目是否正确且所有必须信息是可用的 |
编译 compile | 执行编译 | 源代码编译在此阶段完成 |
测试 Test | 测试 | 使用适当的单元测试框架(例如JUnit)运行测试。 |
包装 package | 打包 | 创建JAR/WAR包如在 pom.xml 中定义提及的包 |
检查 verify | 检查 | 对集成测试的结果进行检查,以保证质量达标 |
安装 install | 安装 | 安装打包的项目到本地仓库,以供其他项目使用 |
部署 deploy | 部署 | 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程 |
Maven 有以下三个标准的生命周期:
- clean:项目清理的处理,清理项目上一次构建生成的字节码等文件。当我们执行 mvn clean 命令时,Maven 调用 clean 生命周期,它包含以下三个阶段:
- pre-clean:执行一些需要在clean之前完成的工作
- clean:移除所有上一次构建生成的文件
- post-clean:执行一些需要在clean之后立刻完成的工作
- default(或 build):项目部署的处理,这是 Maven 的主要生命周期,被用于构建应用。
- site:项目站点文档创建的处理。
Default (Build) 生命周期
这是 Maven 的主要生命周期,被用于构建应用,包含以下23个阶段
生命周期阶段 | 描述 |
---|---|
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 生命周期相关的重要概念说明:
当一个阶段通过 Maven 命令调用时,例如 mvn compile,只有该阶段之前以及包括该阶段在内的所有阶段会被执行,也就是说maven的构建是严格遵循顺序的,后一阶段的maven命令会先执行之前的命令,然后执行当前命令。
不同的 maven 目标将根据打包的类型(JAR / WAR / EAR),被绑定到不同的 Maven 生命周期阶段。
详情:https://www.runoob.com/maven/maven-build-life-cycle.html
四、maven构建配置文件
构建配置文件是一系列的配置项的值,可以用来设置或者覆盖 Maven 构建默认值。
构建配置文件大体上有三种类型:
类型 | 在哪定义 |
---|---|
项目级(Per Project) | 定义在项目的POM文件pom.xml中 |
用户级 (Per User) | 定义在Maven的设置xml文件中 (%USER_HOME%/.m2/settings.xml) |
全局(Global) | 定义在 Maven 全局的设置 xml 文件中 (%M2_HOME%/conf/settings.xml) |
配置文件激活
Maven的构建配置文件可以通过多种方式激活。
- 使用命令控制台输入显式激活。
- 通过 maven 设置。
- 基于环境变量(用户或者系统变量)。
- 操作系统设置(比如说,Windows系列)。
- 文件的存在或者缺失。
命令行方式激活配置文件
在pom.xml中使用
mvn test -P 指定的id中的名字,也就是
通过maven设置进行激活配置文件
配置 setting.xml 文件,增加 <activeProfiles>属性
五、Maven仓库
Maven仓库是项目中依赖的第三方库,这个库所在的位置叫做仓库,也就是存放各种jar资源的地方。在Maven 中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。
maven仓库有三种类型:本地仓库,中央仓库,远程仓库(也可叫私服)。
本地仓库
运行 Maven 的时候,Maven 所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。
可以在Maven的setting.xml配置文件中修改本地仓库位置: <localRepository>本地仓库位置</localRepository>
中央仓库
Maven 中央仓库是由 Maven 社区提供的仓库,其中包含了大量常用的库。
中央仓库的关键概念:
- 这个仓库由 Maven 社区管理。
- 不需要配置。
- 需要通过网络才能访问。
要浏览中央仓库的内容,maven 社区提供了一个 URL:http://search.maven.org/#browse。使用这个仓库,开发人员可以搜索所有可以获取的代码库。
远程仓库
如果 Maven 在中央仓库中也找不到依赖的文件,它会停止构建过程并输出错误信息到控制台。为避免这种情况,Maven 提供了远程仓库的概念,它是开发人员自己定制仓库,也就是私服,包含了所需要的代码库或者其他工程中用到的jar包文件。
Maven依赖搜索顺序
当我们执行 Maven 构建命令时,Maven 开始按照以下过程查找依赖的jar包:
解释:
-
步骤 1 - 在本地仓库中搜索,如果找不到,执行步骤 2,如果找到了则执行其他操作。
-
步骤 2 - 在中央仓库中搜索,如果找不到,并且有一个或多个远程仓库已经设置,则执行步骤 4,如果找到了则下载到本地仓库中以备将来引用。
-
步骤 3 - 如果远程仓库没有被设置,Maven 将简单的停滞处理并抛出错误(无法找到依赖的文件)。
-
步骤 4 - 在一个或多个远程仓库中搜索依赖的文件,如果找到则下载到本地仓库以备将来引用,否则 Maven 将停止处理并抛出错误(无法找到依赖的文件)。
也就是maven会首先从本地仓库中找依赖,如果本地找不到则去中央仓库找,中央仓库也找不到,但配置了远程仓库,那么就去远程仓库中找,找到了都会下载到本地。没找到就报错。
仓库的配置可以在maven的conf配置文件中的settings.xml中配置。
例如配置阿里云仓库第一步:修改 maven 根目录下的 conf 文件夹中的 setting.xml 文件,在 mirrors 节点上,添加内容如下: <mirrors> <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors> 第二步: pom.xml文件里添加: <repositories> <repository> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>
六、Maven插件
Maven 有以下三个标准的生命周期:
- clean:项目清理的处理,清理项目上一次构建生成的字节码等文件。当我们执行 mvn clean 命令时,Maven 调用 clean 生命周期,它包含以下三个阶段:
- pre-clean:执行一些需要在clean之前完成的工作
- clean:移除所有上一次构建生成的文件
- post-clean:执行一些需要在clean之后立刻完成的工作
- default(或 build):项目部署的处理,这是 Maven 的主要生命周期,被用于构建应用。
- site:项目站点文档创建的处理。
每个生命周期中都包含着一系列的阶段(phase)。这些 phase 就相当于 Maven 提供的统一的接口,然后这些 phase 的实现由 Maven 的插件来完成。
Maven 生命周期的每一个阶段的具体实现都是由 Maven 插件实现的。
Maven 实际上是一个依赖插件执行的框架,每个任务实际上是由插件完成。
maven插件被用来:创建jar文件,war文件,编译代码文件,代码单元测试,创建工程文档,创建工程报告。
插件通常提供了一个目标的集合,并且可以使用下面的语法执行:
<code>mvn [plugin-name]:[goal-name]</code>
例如,一个 Java 工程可以使用 maven-compiler-plugin 的 compile-goal 编译,使用以下命令:
<code>mvn compiler:compile</code>
插件类型
Maven 提供了下面两种类型的插件:
类型 | 描述 |
---|---|
Build plugins | 在构建时执行,并在 pom.xml 的 元素中配置。 |
Reporting plugins | 在网站生成过程中执行,并在 pom.xml 的 元素中配置。 |
下面是一些常用插件的列表:
插件 | 描述 |
---|---|
clean | 构建之后清理目标文件。删除目标目录。 |
compiler | 编译 Java 源文件。 |
surefile | 运行 JUnit 单元测试。创建测试报告。 |
jar | 从当前工程中构建 JAR 文件。 |
war | 从当前工程中构建 WAR 文件。 |
javadoc | 为工程生成 Javadoc。 |
antrun | 从构建过程的任意一个阶段中运行一个 ant 任务的集合。 |
案例详情:https://www.runoob.com/maven/maven-plugins.html
以上就是maven的基础知识复习整理。