1. 概述
在这个简短的教程中,我们将概述使用Maven 的超级、最简单和有效 POM 之间的区别。
2. 什么是POM?
POM 代表 项目对象模型, 它是 Maven 中项目配置的核心。它是一个名为 pom.xml 的单一配置 XML 文件,其中包含构建项目所需的大部分信息。
POM 文件的作用是描述项目、管理依赖项并声明帮助 Maven 构建项目的配置详细信息。
3.超级聚甲醛
为了更容易理解super POM,我们可以与Java中的 Object 类进行类比:默认情况下,Java中的每个类都扩展了 Object 类。类似地,对于 POM,每个 POM 都扩展了超级 POM。
super POM 文件定义了所有默认配置。 因此,即使是最简单形式的 POM 文件也会继承超级 POM 文件中定义的所有配置。
根据我们使用的 Maven 版本,超级 POM 看起来可能略有不同。例如,如果我们在机器中安装了 Maven,我们可以在 ${M2_HOME}/lib 、 maven-model-builder- 中可视化它 .jar 文件。如果我们打开这个 JAR 文件,我们会在名称 org/apache/maven/model/pom-4.0.0.xml 下找到它。
在接下来的部分中,我们将介绍版本 3.6.3 的超级 POM 配置元素。
3.1.存储库
Maven 使用 存储 库部分下定义的存储库来下载 Maven 构建期间的所有依赖工件。
让我们看一个例子:
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
3.2.插件存储库
默认插件存储库是中央 Maven 存储库。让我们看看它在 pluginRepository 部分是如何定义的:
<pluginRepositories>
<pluginRepository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
</pluginRepository>
</pluginRepositories>
正如我们在上面看到的,快照被禁用,并且 updatePolicy 设置为“ never ”。因此,通过此配置,如果发布新版本,Maven 将永远不会自动更新插件。
3.3.建造
构建 配置部分包含构建项目所需的所有信息。
让我们看一下默认 构建 部分的示例:
<build>
<directory>${project.basedir}/target</directory>
<outputDirectory>${project.build.directory}/classes</outputDirectory>
<finalName>${project.artifactId}-${project.version}</finalName>
<testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
<sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
<scriptSourceDirectory>${project.basedir}/src/main/scripts</scriptSourceDirectory>
<testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>${project.basedir}/src/test/resources</directory>
</testResource>
</testResources>
<pluginManagement>
<!-- NOTE: These plugins will be removed from future versions of the super POM -->
<!-- They are kept for the moment as they are very unlikely to conflict
with lifecycle mappings (MNG-4453) -->
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.3</version>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-5</version>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.8</version>
</plugin>
<plugin>
<artifactId>maven-release-plugin</artifactId>
<version>2.5.3</version>
</plugin>
</plugins>
</pluginManagement>
</build>
3.4.报告
对于 报告 ,超级 POM 仅提供输出目录的默认值:
<reporting>
<outputDirectory>${project.build.directory}/site</outputDirectory>
</reporting>
3.5.型材
如果我们没有在应用程序级别定义 配置文件 ,则将执行默认的构建配置文件。
默认 配置文件 部分如下所示:
<profiles>
<!-- NOTE: The release profile will be removed from future versions of the super POM -->
<profile>
<id>release-profile</id>
<activation>
<property>
<name>performRelease</name>
<value>true</value>
</property>
</activation>
<build>
<plugins>
<plugin>
<inherited>true</inherited>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<inherited>true</inherited>
<artifactId>maven-javadoc-plugin</artifactId>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<inherited>true</inherited>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<updateReleaseInfo>true</updateReleaseInfo>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
4.最简单的POM
最简单的 POM 是您在 Maven 项目中声明的 POM。 为了声明 POM,您需要至少指定这四个元素: modelVersion 、 groupId 、 artifactId 和 version 。 最简单的 POM 将继承超级 POM 的所有配置 。
让我们看一下 Maven 项目所需的最低元素:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.baeldung</groupId>
<artifactId>maven-pom-types</artifactId>
<version>1.0-SNAPSHOT</version>
</project>
Maven 中 POM 层次结构的一个主要优点是我们可以扩展和覆盖从顶部继承的配置。 因此,要覆盖 POM 层次结构中给定元素或工件的配置,Maven 应该能够唯一标识相应的工件。
5.有效的POM
有效的 POM 结合了超级 POM 文件中的所有默认设置和我们的应用程序 POM 中定义的配置。 当配置元素在应用程序 pom.xml 中未被覆盖时,Maven 使用默认值。因此,如果我们从最简单的 POM 部分获取相同的示例 POM 文件,我们将看到有效的 POM 文件将是最简单的 POM 和超级 POM 之间的合并。我们可以从命令行将其可视化:
mvn help:effective-pom
这也是查看 Maven 使用的默认值的最佳方式。
六,结论
在这个简短的教程中,我们讨论了 Maven 中 项目对象模型 之间的差异。
与往常一样,本教程中显示的示例可以在 GitHub 上找到。