![轻量级Java EE企业应用开发实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/980/44509980/b_44509980.jpg)
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的核心内容。
![](https://epubservercos.yuewen.com/A99FE4/23721413109387006/epubprivate/OEBPS/Images/Figure-P57_78787.jpg?sign=1739329013-xGAFsLUmAnySjhKrtgKDz5BZdVExBY32-0-3fefc530eccc37f5fd4bb6596bc1c05d)
![](https://epubservercos.yuewen.com/A99FE4/23721413109387006/epubprivate/OEBPS/Images/Figure-P58_78788.jpg?sign=1739329013-znZaceNghv3xb7HyTInv6D5NzMt2ZE0T-0-212664428bb6880be701977cf9ea1ad7)
![](https://epubservercos.yuewen.com/A99FE4/23721413109387006/epubprivate/OEBPS/Images/Figure-P59_78789.jpg?sign=1739329013-GWoHfJSPwLQZyYTY6OTVUAFvDbuKfDL2-0-36ae5fe53c8789f1157bf15e45cfbcd2)
![](https://epubservercos.yuewen.com/A99FE4/23721413109387006/epubprivate/OEBPS/Images/Figure-P60_78790.jpg?sign=1739329013-jWBq8pHsnoztVM2RAAEgWZQx7TN5OvLN-0-04be6eac65c8c9c4a96891fc10bcf200)
从上述配置文件我们能够理解为什么hello-world项目的main目录下就是平时开发的功能代码,而test下则放置的是测试代码。
2.3.2 最小化POM
POM的最低要求如下:
- project
- modelVersion
- groupId
- artifactId
- version
以下是一个例子:
![](https://epubservercos.yuewen.com/A99FE4/23721413109387006/epubprivate/OEBPS/Images/Figure-P60_78791.jpg?sign=1739329013-fiQWpQ92tPHFEkSoYG68ZFnUtXKq1pNP-0-08e9372250fee2121d50b6d902d94551)
一个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)的核心理念。