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}/libmaven-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,您需要至少指定这四个元素: modelVersiongroupIdartifactIdversion最简单的 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 上找到。