文章目录
一、POM 文件是什么?
Maven的中心思想即POM文件((Project Object Model)
项目对象模型)。
POM文件是以XML文件的形式,描述项目用到的资源,如源码目录、测试代码目录、依赖(用到的外部Jar包)等。
pom.xml
是整个系统的基础组件,位于项目根目录下。
二、Maven 如何使用POM文件?
上图说明了Maven是如何使用POM文件的,当执行一条Maven命令的时候,会依次进行以下步骤:
1、读取项目根目录下的pom.xml
,并根据pom.xml
中的描述来执行下一步操作。
2、根据pom.xml
中的<dependencies>
,下载依赖到本地仓库中。
3、构建生命周期、阶段和目标。
4、构建插件。
三、POM文件的主要组成部分
POM文件描述的是构建“什么”,而不是“如何”构建。 如何构建是取决于Maven的构建阶段和目标。
每一个项目都有一个POM文件,即pom.xml,位于项目的根目录下。
pom.xml 主要包括以下几部分:
3.1 构建生命周期、阶段和目标
Maven的构建过程被分解为构建生命周期、阶段和目标。
<build> -> <phase> -> <goals>
-
一个构建周期由一系列的构建阶段组成。
-
每一个构建阶段由一系列的目标组成。
当我们使用一条命令来运行Maven的时候,这条命令就是构建生命周期、阶段或目标的名字。
-
如果执行的是一个生命周期,该生命周期内的所有构建阶段都会被执行。
-
如果执行的是一个构建阶段,在预定义的构建阶段中,所有处于当前构建阶段之前的阶段也都会被执行。
3.2 依赖和仓库
<repository> 仓库节点,<dependencies> 依赖节点
Maven执行时,其中一个首要目标就是检查项目的依赖(需要的jar 包)。
如果在本地仓库中不存在该依赖,则Maven会从中央仓库和远程仓库下载并放到本地仓库。(后面会单独讲解怎么修改本地仓库路径、怎么添加远程仓库)
3.3 构建插件
<plugins> 节点
构建插件可以向构建阶段中增加额外的构建目标。
如果Maven标准的构建阶段和目标无法满足项目构建的需求,可以在POM文件里增加插件。
Maven有一些标准的插件供选用,如果需要也可以自己实现插件。
3.4 配置文件
<profiles> 节点
配置文件用于以不同的方式构建项目。
比如,你可能需要在本地环境构建,用于开发和测试,你也可能需要构建后用于开发环境。这两个构建过程是不同的。
在POM文件中增加不同的构建配置,可以启用不同的构建过程。当运行Maven时,可以指定要使用的配置。
四、Maven 项目继承
1、父子工程中的POM
(以下内容中子项目
与 模块
的概念是类似的,所以也可以对应的理解为模块
)
一个项目如果分为多个子项目/模块,一般来讲,父项目有一个POM文件,每一个子项目也有一个POM文件。在这种结构下,既可以一步构建整个项目,也可以各个子项目分开构建。
2、 POM 继承的原理
POM 继承的原理类似于Java中的类继承关系,可以结合理解。
当有多个子项目时,使用 POM 继承可以大大减少配置的工作量。
-
把多个子项目之间一些共性的东西(比如说类似的配置、相同的jar包等等),定义在父项目的pom.xml文件中。
-
子项目继承父项目后,在自己的pom.xml中只放自己个性的东西,大大减少了工作量。
-
默认情况下,所有的Maven pom文件都继承自一个根pom。如果没有显式指定父pom,则该pom文件继承自根pom。
-
子pom文件的设置可以覆盖父pom文件的设置,只需要在子pom文件里指定新的设置即可。
3、POM继承关系图
如果要继承根pom以外的pom,需要在子pom中显示地指定父pom。
4、如何显示指定父pom呢?
- 在子项目的pom.xml起始处设置
<parent>
节点来指定父项目。
如:
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent> 指定父pom
<groupId>org.codehaus.mojo</groupId>
<artifactId>my-parent</artifactId>
<version>2.0</version>
<relativePath>../my-parent</relativePath>
</parent>
<artifactId>my-project</artifactId>
…
</project>
五、POM文件字段解析
如下为一个最小化的POM文件示例:
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.jenkov</groupId>
<artifactId>java-web-crawler</artifactId>
<version>1.0.0</version>
</project>
1、各字段解析
-
modelVersion
:使用的POM模型的版本。- 一般选择正在使用的Maven版本一致的版本即可。
- 版本4.0.0适用于Maven 2和3。
-
groupId
:一个组织或者项目(比如开源项目)的唯一ID。一般使用项目的java包的根名称作为group ID。类似com.xxx.xxxx
。- 使用带.分隔符的java包名作为groupId,这一点并不是必须的。
- 但是,如果按照这样的规范来定义groupId,项目将会位于Maven仓库的结构化目录中,该结构化目录与group ID匹配。每一个.是一个目录分隔符,每一个词都表示一个目录。
- 比如:group ID为com.jenkov的项目将位于目录MAVEN_REPO/com/jenkov中。目录路径中的MAVEN_REPO表示Maven仓库的路径。
-
artifactId
:正在构建的项目的名称。- 它也是构建完项目后生成的jar包的文件名的一部分。构建过程的输出,即构建结果,在Maven中称为构件(artifact)。通常它就是一个jar包、war包或者EAR包等等。
-
version
:项目的版本号。- 可以用来识别项目不同的发行版。
- 它是artifact ID目录下的子目录名。
- 它也用作构建结果即jar包名称的一部分。
上文中的groupId,artifactId和version属性,在项目构建后会生成一个jar文件,位于Maven仓库的如下路径中(目录和文件名):MAVEN_REPO/com/jenkov/java-web-crawler/1.0.0/java-web-crawler-1.0.0.jar
上面只是构建maven项目最基本的一些配置,实际开发中,还会增加更多的配置来辅助构建。