Apache Maven 一个由Java 语言编写的包管理工具。可以帮助我们管理,分析项目依赖。以及构建工程。


1 Maven 的安装

可以直接参考Apache Maven 安装 的指导,安装过程比较简单。首先要把Jdk 安装好。其次是以下几个步骤

  1. 下载,解压maven。
  2. 配置Maven环境变量。
  3. 输入 mvn -h 检查是否安装成功。如下所示,即表示安装成功。




maven 编译的时候复制不了资源文件_maven provided


2 Maven 命令

Maven通过命令驱动自身工作。

常用的Maven命令如下:

命令

说明

mvn clean

清理Maven 项目。会删除目标路径(一般是target目录)Maven生成的打包文件,编译文件。

mvn package

打包Maven项目,会生成jar 或者war文件。

mvn test

执行test目录下的测试用例。

mvn deploy

发布依赖到远端

mvn site

生成项目相关的信息

mvn archetype

创建Maven 项目

mvn tomcat:run

运行在Tomcat容器

mvn install

安装依赖

  1. mvn archetype 创建项目

archetype翻译过来就是典型,就是项目模版。

Maven 拥有众多类型的archetype


maven 编译的时候复制不了资源文件_maven deploy plugin_02


mvn archetype:create


执行mvn archetype:create 有以下三个参数

参数

说明

-DgroupId

项目的包名,比如 com.main.test

-DartifactId

项目的名称,比如 MavenTest

-DarchetypeArtifactId

项目的模版名称,

比如上图的 maven-archetype-weapp

mvn archetype:generate


mvn archetype:generate 是 mvn archetype:create 的便捷版本.执行后 只需要根据项目 来选择,最后即可生成Maven项目。


maven 编译的时候复制不了资源文件_maven deploy plugin_03


可以看到Maven 默认使用的archetype 是maven-archetype-quickstart。

接下来,我们使用我们创建的项目,来讲解Maven项目的构成。

3 Maven 项目构成


maven 编译的时候复制不了资源文件_maven provided_04


接下来再使用mvn archetype:generate创建一个Maven Web 项目。


maven 编译的时候复制不了资源文件_maven打包跳过test_05


可以看到,Maven 的标准项目中存在src/main/java和src/main/test文件夹。默认的web项目中是不存在的,但是我们依然可以通过手动创建的方式,为其创建这两个文件夹。

Maven 不仅仅是一个包管理工具,更是一个项目结构的规范标杆。遵守既定的标准,会使项目便于维护,降低开发成本。


maven 编译的时候复制不了资源文件_maven打包跳过test_06


Pom.xml

通过观察Maven的项目,会发现每一个项目中都存在一个pom.xml。这个xml 文件 其实就是Maven项目的配置文件。通过它 可以管理项目的依赖,依赖仓库,活动文件,构建,Maven模块的聚合,以及项目信息的配置等等。

接下来,我们分别讲解Pom 文件在Maven中的应用。

  1. 依赖配置
<dependencyManagement>


依赖dependencies,即依赖模块,内部由多个dependency,即依赖的具体内容。

dependency内部有groupId,artifactId,version ,scope组成了Maven的坐标,根据坐标可以在仓库中找到一个唯一的包。

对于 Scope 有必要做一下解释,

Scope 指定了依赖的 作用范围 ,默认是compile。并且具有传递性。

Scope 有以下选择test,compile,runntime,provided,system 五个。

Scope

说明

test

只有和test相关的编译和运行才参与进来。

compile

完整的参与maven 的生命周期。

runtime

跳过了compile阶段。

provided

没有这个包的时候,才参与进来。跳过了package阶段。

system

指示Maven 只在systemPath指定的路径下寻找包。

在dependencies的上层还有一个标签dependencyManagement。一般是聚合模块的时候 在跟模块下使用,其他的子模块在引入包的时候都是引入的根模块的依赖。只有根模块不存的时候 才会去自己去根据坐标寻找依赖。

2. 活动文件


<profiles>


活动文件的主要作用是 在执行mav package 的时候通过 -P 参数来指定活动的配置。


mav package -P dev


执行后 就会选择 dev节点下的配置,从dev中过滤出dev.properties来使用。

Maven的标签都可以在profile内部 复写。

3. 构建


<build>


build节点内主要是可以指定resources资源 和 plugin。比如compiler 和 war插件,可以自己选择指定的插件,如果你需要打包jar 就需要jar打包插件。同样的如果使用了pluginManagement那么子模块会跟随根模块使用一样的插件。


mvn package


执行Maven 的构建,并按照<packaging>war</packaging>所指定的方式进行打包。

Maven 会帮我们执行clean,resource,compile,test,war这个几个插件的工作。最后生成war包。

4 Maven的生命周期和基本原理

  1. Maven的生命周期

Maven 有三个生命周期clean、default 和 site。

生命周期

说明

clean

执行清理相关的时候会触发该生命周期。比如mvn clean

default

构建项目

site

建立项目站点

clean 周期组成:

阶段

说明

pre-clean

清理前

clean

执行清理

post-clean

清理后

default 周期组成:

阶段

说明

validate

验证项目是否村存在 mvn validate 触发

initialize

初始化阶段

compile

编译项目中的源代码 mvn compile 触发

test-compile

编译项目中的测试源代码 mvn test 触发

test

执行test用例 mvn test 触发

package

编译资源打包,jar或者 war mvn package 触发

verify

检验包是否完好 mvn varify 触发

install

安装打包好的资源到本地仓库 mvn install 触发

deploy

发布包到远程仓库。mvn deploy 触发

以上阶段自上而下,比如执行mvn validate就只会执行validate阶段。而执行mvn deploy 会执行

validate到deploy的所有阶段。

site 周期组成:

阶段

说明

pre-site

生成站点文档前

site

生成站点文档

post-site

生成站点文档后

site-deploy

发布站点

2. Maven的基本原理


maven 编译的时候复制不了资源文件_maven打包跳过test_07


我们借助IDEA来观察Maven,发现他只有三个组成部分。

  • Lifecycle
  • Plugins
  • Dependencies

对于Lifecycle(生命周期)上边已经展示过了。而Plugins正是对应了,在不同的生命周期执行具体动作的插件。Dependencies 就是项目的依赖包。

也就是说 我们在执行mvn clean 这个命令的时候,触发了Maven生命周期的clean周期,在这个周期内clean插件来帮我们执行了清理动作。

Maven 是一个插件执行框架。通过插件在不同的时期,做不同的事情。我们把不同的时期,总结为Maven的生命周期,而做不同事情的本体就是插件。

书写尚未完成,将持续更新。