Difference Between Super, Simplest, and Effective POM – 超级、最简单和有效的POM之间的区别

最后修改: 2021年 5月 26日

中文/混合/英文(键盘快捷键:t)

1. Overview

1.概述

In this short tutorial, we are going to overview the differences between super, simplest, and effective POM using Maven.

在这个简短的教程中,我们将概述使用Maven的超级、最简单和有效的POM之间的区别。

2. What Is a POM?

2.什么是POM?

POM stands for Project Object Model, and it is the core of a project’s configuration in Maven. It is a single configuration XML file called pom.xml that contains the majority of the information required to build a project.

POM代表项目对象模型,是Maven中项目配置的核心。它是一个名为pom.xml的单一配置XML文件,包含构建项目所需的大部分信息。

The role of a POM file is to describe the project, manage dependencies, and declare configuration details that help Maven to build the project.

POM文件的作用是描述项目,管理依赖关系,并声明有助于Maven构建项目的配置细节。

3. Super POM

3.超级POM

To understand super POM more easily, we can make an analogy with the Object class from Java: Every class from Java extends, by default, the Object class. Similarly, in the case of POM, every POM extends the super POM.

为了更容易理解超级POM,我们可以用Java中的Object类来做个类比。Java中的每个类都默认扩展了Object类。同样地,在POM的情况下,每个POM都扩展了超级POM。

The super POM file defines all the default configurations. Hence, even the simplest form of a POM file will inherit all the configurations defined in the super POM file.

超级POM文件定义了所有的默认配置。因此,即使是最简单形式的POM文件也将继承超级POM文件中定义的所有配置。

Depending on the Maven version that we use, the super POM can look slightly different. For instance, if we have Maven installed into our machine, we can visualize it at  ${M2_HOME}/lib, maven-model-builder-<version>.jar file. If we open this JAR file, we’ll find it under the name org/apache/maven/model/pom-4.0.0.xml.

根据我们使用的Maven版本,超级POM的外观会略有不同。例如,如果我们的机器安装了Maven,我们可以在${M2_HOME}/libmaven-model-builder-<version>.jar文件中看到它。如果我们打开这个JAR文件,我们会发现它的名字是org/apache/maven/model/pom-4.0.0.xml

In the next sections, we’ll go through the super POM configuration elements for version 3.6.3.

在接下来的章节中,我们将浏览版本3.6.3.的超级POM配置元素。

3.1. Repositories

3.1.存储库

Maven uses the repositories defined under the repositories section to download all the dependent artifacts during a Maven build.

在Maven构建过程中,Maven使用repositories部分定义的资源库来下载所有依赖的构件。

Let’s take a look at an example:

我们来看看一个例子。

<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. Plugin Repositories

3.2.插件库

The default plugin repository is the central Maven repository. Let’s look at how it’s defined in the pluginRepository section:

默认的插件仓库是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>

As we can see above, snapshots are disabled, and the updatePolicy is set to “never”. Therefore, with this configuration, Maven will never automatically update a plugin if a new version is released.

正如我们在上面看到的,快照被禁用,updatePolicy被设置为”never“。因此,在这种配置下,如果有新版本发布,Maven绝不会自动更新一个插件。

3.3. Build

3.3.构建

The build configuration section includes all the information required to build a project.

build配置部分包括建立一个项目所需的所有信息。

Let’s see an example of the default build section:

让我们看看默认build部分的一个例子。

<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. Reporting

3.4.报告

For reporting, the super POM only provides a default value for the output directory:

对于报告,超级POM只为输出目录提供一个默认值。

<reporting>
    <outputDirectory>${project.build.directory}/site</outputDirectory>
</reporting>

3.5. Profiles

3.5.概况

If we do not have defined profiles at the application level, the default build profile will be executed.

如果我们在应用层面没有定义profiles,将执行默认的构建配置文件。

The default profiles section looks like:

默认的profiles部分看起来像。

<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. Simplest POM

4.最简单的POM

The simplest POM is the POM that you declare in your Maven project. In order to declare a POM, you will need to specify at least these four elements: modelVersion, groupId, artifactId, and version. The simplest POM will inherit all the configurations from the super POM.

最简单的POM是你在Maven项目中声明的POM。为了声明一个POM,你至少需要指定这四个元素。modelVersion, groupId, artifactId, 和version最简单的POM将继承超级POM的所有配置

Let’s have a look at the minimum required elements for a Maven project:

让我们来看看Maven项目所需的最低要素。

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.baeldung</groupId>
    <artifactId>maven-pom-types</artifactId>
    <version>1.0-SNAPSHOT</version>
</project>

One main advantage of the POM hierarchy in Maven is that we can extend and override the configuration inherited from the top. Therefore, to override the configuration of a given element or an artifact in the POM hierarchy, Maven should be able to uniquely identify the corresponding artifact.

Maven的POM层次结构的一个主要优势是,我们可以扩展和覆盖从上层继承的配置。因此,要覆盖POM层次结构中某个特定元素或工件的配置,Maven应该能够唯一地识别相应的工件。

5. Effective POM

5.有效的POM

Effective POM combines all the default settings from the super POM file and the configuration defined in our application POM. Maven uses default values for configuration elements when they are not overridden in the application pom.xml. Hence, if we take the same sample POM file from the simplest POM section, we’ll see that the effective POM file will be the merge between simplest and super POM. We can visualize it from the command line:

有效POM结合了超级POM文件的所有默认设置和我们应用POM中定义的配置。当配置元素在应用pom.xml中没有被覆盖时,Maven会使用默认值。因此,如果我们从最简单的POM部分抽取相同的POM文件,我们会发现有效的POM文件将是最简单和超级POM的合并。我们可以从命令行中直观地看到它。

mvn help:effective-pom

This is also the best way to see the default values that Maven uses.

这也是查看Maven使用的默认值的最佳方式。

6. Conclusion

6.结论

In this short tutorial, we discussed the differences between Project Object Models in Maven.

在这个简短的教程中,我们讨论了Maven中项目对象模型之间的区别。

As always, the example shown in this tutorial is available over on GitHub.

一如既往,本教程中显示的示例可在GitHub上获取。