Maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于 Java 平台的项目构建和依赖管理
在以前,我们开发Java应用要依赖一些jar包,我们要去网上找这些需要的jar包,并把它们复制到相应的工程目录下( WEB-INF/lib )。
缺点:
1.每次都要在网上寻找相应的jar包,浪费时间。
2.jar包之间存在依赖关系,比如你引入jar包A,A本身就依赖于jar包B,此时你就还需要引入jar包B。况且,jar包之间的依赖关系会更复杂,有可能引入几个jar包的同时就需要引入十几个jar包。所以,手动的引入jar包,还要理解它们的依赖关系,浪费时间。
3.每次创建一个新的工程就需要将 jar 包重复复制到 WEB-INF/lib 目录下,从而造成工作区中存在大量重复的文件,让我们的工程显得很臃肿。
Maven就能完美的解决以上问题。
Maven 的九个核心概念:
①POM ②约定的目录结构 ③坐标 ④依赖管理 ⑤仓库管理 ⑥生命周期 ⑦插件和目标 ⑧继承 ⑨聚合
Project Object Model:项目对象模型。将 Java工程的相关信息封装为对象作为便于操作和管理的模型。 Maven 工程的核心配置。可以说学习 Maven 就是学习 pom.xml 文件中的配置。
约定的目录结构对于 Maven 实现自动化构建而言是必不可少的一环,就拿自动编译来说,Maven 必须能找到 Java 源文件,下一步才能编译,而编译之后也必须有一个准确的位置保持编译得到的字节码文件。
在开发中普遍认为:约定>配置>编码。
意思就是能用配置解决的问题就不编码,能基于约定的就不进行配置。而 Maven 正是因为指定了特定文件保存的目录才能够对我们的 Java 工程进行自动化构建。
我们在开发中如果需要让第三方工具或框架知道我们自己创建的资源在哪,那么基本上就是两种方式:
①通过配置的形式明确告诉它
②基于第三方工具或框架的约定
Maven 对工程目录结构的要求就属于后面的一种。
Maven使用如下三个向量坐标(GAV)在 Maven 的仓库中唯一的确定一个 Maven 工程。
[1]groupid:公司或组织的域名倒序+当前项目名称
[2]artifactId:当前项目的模块名称
[3]version:当前模块的版本
使用 dependency 标签指定被依赖 jar 包的坐标
[1]本地仓库:为当前本机电脑上的所有 Maven 工程服务。
[2]远程仓库 :
(1)私服:架设在当前局域网环境下,为当前局域网范围内的所有 Maven 工程服务。
(2)中央仓库:架设在 Internet 上,为全世界所有 Maven 工程服务。
(3)中央仓库的镜像:架设在各个大洲,为中央仓库分担流量。减轻中央仓库的压力,同时更快的响应用户请求。
[1]Maven自身需要的插件
[2]我们自己开发的Maven工程
[3]第三方框架或工具的 jar 包
不管是什么样的 jar 包,在仓库中都是按照坐标生成目录结构,所以可以通过统一的方式查询或依赖
Maven 生命周期定义了各个构建环节的执行顺序,有了这个清单,Maven 就可以自动化的执行构建命令了。
运行任何一个阶段的时候,它前面的所有阶段都会被运行,例如我们运行 mvn install (安装)的时候,代码会被编译,测试,打包。这就是 Maven 为什么能够自动执行构建过程的各个环节的原因。此外,Maven 的插件机制是完全依赖 Maven 的生命周期的,因此理解生命周期至关重要。
一个典型的 Maven 构建(build)生命周期是由以下几个阶段的序列组成的:
Maven 有以下三个标准的生命周期
对于生命周期的概述,可以参考菜鸟教程:
https://www.runoob.com/maven/maven-build-life-cycle.html
●Maven 的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的。
●每个插件都能实现多个功能,每个功能就是一个插件目标。
●Maven 的生命周期与插件目标相互绑定,以完成某个具体的构建任务。
如:compile 就是插件maven-compiler-plugin的一个目标;pre-clean是插件maven-clean-plugin的一个目标。
假设现在有三个工程A,B, C
A的junit版本:4.0
B的junit版本:4.0
C的junit版本:4.9
此时如果项目需要将各个模块的junit版本统一为4.9,那么到各个工程中手动修改无疑是非常不可取的。 使用继承机制就可以将这样的依赖信息统一提取到父工程模块中进行统一管理
创建父工程和创建一般的 Java 工程操作一致,唯一需要注意的是:打包方式处要设置为 pom
将 Parent 项目中的 dependencies 标签,用 dependencyManagement 标签括起来
在子项目中重新指定需要的依赖,删除范围和版本号
将多个工程拆分为模块后,需要手动逐个安装到仓库后依赖才能够生效。修改源码后也需要逐个手动进行 clean 操作。而使用了聚合之后就可以批量进行 Maven 工程的安装、清理工作,一键安装各个模块工程。
在总的聚合工程中使用 modules/module 标签组合,指定模块工程的相对路径即可
mvn clean:清理
mvn compile:编译
mvn test-compile:编译测试
mvn test:测试
mvn package:打包
mvn install:安装
mvn site:生成站点