
2.3 理解POM
POM(Project Object Model,项目对象模型)是Maven中的基本工作单元。POM是一个XML文件,其中包含有关项目的信息以及Maven用于构建项目的详细配置信息。它包含大多数项目的默认值。比如在hello-world项目例子中,项目根目录下的pom.xml就是一个POM文件。当执行任务或目标时,Maven会在当前目录中查找POM文件,并读取POM文件,以获取所需的配置信息,然后执行目标。
可以在POM中指定的一些项目依赖项、插件或目标、构建配置文件等,也可以指定其他信息,例如项目版本、项目描述、开发人员姓名、邮件列表等。
2.3.1 Super POM
Super POM是Maven的默认POM。除非明确设置,否则所有POM都会扩展为Super POM,这意味着Super POM中指定的配置将由开发者自己创建的项目POM继承。Super POM位于Maven安装目录的/lib/maven-model-builder-x.x.x.jar文件中,解压该JAR文件可以在路径org/apache/maven/model/下看到一个pom-4.0.0.xml文件,该pom-4.0.0.xml文件就是Super POM。下面的代码片段是Super POM的核心内容。




从上述配置文件我们能够理解为什么hello-world项目的main目录下就是平时开发的功能代码,而test下则放置的是测试代码。
2.3.2 最小化POM
POM的最低要求如下:
- project
- modelVersion
- groupId
- artifactId
- version
以下是一个例子:

一个POM要求配置其groupId、artifactId和version,这3个值构成项目的完全限定工件名称,即<groupId>:<artifactId>:<version>的形式。对于上面的示例,其完全限定的工件名称为“com.waylau.java:hello-world:1.0-SNAPSHOT”。
若POM未指定详细配置信息,则Maven将使用其默认值。这些默认值之一是包装类型,每个Maven项目都有包装类型,如果未在POM中指定,那么将使用默认值jar。
此外,可以看到在最小POM中未指定存储库。如果使用最小的POM构建项目,那么它将继承Super POM中的存储库配置。因此,当Maven在最小POM中看到依赖项时,它将知道这些依赖项将从Super POM中指定的https://repo.maven.apache.org/maven2下载。这也体现出了Maven提倡的“约定优于配置”(Convention Over Configuration)的核心理念。