一、POM

Maven 核心概念:POM

① 含义

POM:Project Object Model,项目对象模型。

和 POM 类似的是:

DOM:Document Object Model,文档对象模型。

② 思想

POM 表示将工程抽象为一个模型,再用程序中的对象来描述这个模型。这样我们就可以用程序来管理项目了。我们在开发过程中,最基本的做法就是将现实生活中的事物抽象为模型,然后封装模型相关的数据作为一个对象,这样就可以在程序中计算相关的数据。

二、约定的目录结构

Maven 核心概念:约定的目录结构

① 各个目录的作用

images

另外还有一个 target 目录专门存放构建操作输出的结果。

② 约定目录结构的意义

Maven 为了让构建过程能够尽可能自动化完成,所以必须约定一个目录结构。例如:Maven 执行编译操作,必须先去 Java 源程序目录读取 Java 源代码,然后执行编译,最后把编译结果存放在 target 目录。

③ 约定大于配置

Maven 对于目录结构这个问题,没有采用配置的方式,而是基于约定。这样会让我们在开发过程中非常方便。

如果每次创建 Maven 工程后,还需要针对各个目录的位置进行详细的配置,那肯定非常麻烦。

目前开发领域的技术发展趋势就是:配置大于编码,约定大于配置

三、坐标

1、坐标的作用

在 Maven 仓库中唯一定位到一个 jar 包

2、坐标中的三个向量

向量名称向量作用向量命名规范
groupId定位到公司开发的项目域名倒序.项目名
artifactId定位到项目中的模块模块名
version指定模块版本

3、坐标对应的 jar 包路径

坐标:

1
2
3
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>

上面坐标对应的 jar 包在 Maven 本地仓库中的位置:

1
Maven本地仓库根目录\javax\servlet\servlet-api\2.5\servlet-api-2.5.jar

四、生命周期

1、作用

为了让构建过程自动化完成,Maven 设定了三个生命周期,生命周期中的每一个环节对应构建过程中的一个操作。

2、三个生命周期

生命周期名称作用各个环节
Clean 生命周期清理操作相关pre-clean
clean
post-clean
Site 生命周期生成站点相关pre-site
site
post-site
deploy-site
Default 生命周期主要构建过程validate
generate-sources
process-sources
generate-resources
process-resources 复制并处理资源文件,至目标目录,准备打包。
compile 编译项目的源代码。
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources 复制并处理资源文件,至目标测试目录。
test-compile 编译测试源代码。
process-test-classes
test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
prepare-package
package 接受编译好的代码,打包成可发布的格式,如 JAR。
pre-integration-test
integration-test
post-integration-test
verify
install 将包安装至本地仓库,以让其它项目依赖。
deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享或部署到服务器上运行。

3、特点

  • 前面三个生命周期彼此是独立的。
  • 在任何一个生命周期内部,执行任何一个具体环节的操作,都是从本周期最初的位置开始执行,直到指定的地方。(本节记住这句话就行了,其他的都不需要记)

Maven 之所以这么设计其实就是为了提高构建过程的自动化程度:让使用者只关心最终要干的即可,过程中的各个环节是自动执行的。

五、插件和目标

1、插件

Maven 的核心程序仅仅负责宏观调度,不做具体工作。具体工作都是由 Maven 插件完成的。例如:编译就是由 maven-compiler-plugin-3.1.jar 插件来执行的。

2、目标

一个插件可以对应多个目标,而每一个目标都和生命周期中的某一个环节对应。

Default 生命周期中有 compile 和 test-compile 两个和编译相关的环节,这两个环节对应 compile 和 test-compile 两个目标,而这两个目标都是由 maven-compiler-plugin-3.1.jar 插件来执行的。

六、依赖

1、依赖的基本配置方式

2、依赖的范围

3、依赖的传递性

4、依赖的排除

七、继承

1、在父工程中配置对依赖的管理

2、在子工程引用父工程中管理的依赖

八、聚合

聚合的配置

九、仓库

1、仓库分类

  • 本地仓库:在当前电脑上,为电脑上所有工程服务
  • 远程仓库:需要联网

2、扩展

关于框架之间的依赖信息版本问题:

举例:SpringMVC 用到 jackson 的 jar 包,需要我们自己选择正确的版本。

例如:SpringMVC 的 4.3.20 经过测试确认,需要匹配 jackson 的 2.9.8 版本。

使用 Maven 开发时,个别情况需要解决类似问题。这方面有赖于经验的沉淀和传承(如果有人告诉你现成的答案,就不需要自己摸索了,反之需要自己反复查资料、调试)。

在公司内实际开发时,恰当的依赖信息的组合往往会通过父工程中 dependencyManagement 沉淀下来,形成经验的积累。