1. 概要

この短いチュートリアルでは、 Maven を使用した、スーパー、シンプル、および効果的なPOMの違いについて概説します。

2. POMとは何ですか?

POM は、 Project Object Model、の略で、Mavenでのプロジェクト構成のコアです。 これは、 pom.xml と呼ばれる単一の構成XMLファイルであり、プロジェクトの構築に必要な情報の大部分が含まれています。

POM ファイルの役割は、プロジェクトを記述し、依存関係を管理し、Mavenがプロジェクトをビルドするのに役立つ構成の詳細を宣言することです。

3. スーパーPOM

スーパーPOMをより簡単に理解するために、Javaの Object クラスに例えることができます。Javaのすべてのクラスは、デフォルトでObjectクラスを拡張します。 同様に、POMの場合、すべてのPOMがスーパーPOMを拡張します。

スーパー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 構成セクションには、プロジェクトのビルドに必要なすべての情報が含まれています。

デフォルトの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 の場合、スーパー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を宣言するには、少なくとも次の4つの要素を指定する必要があります: modelVersion groupId ArtifactId 、およびバージョン最も単純な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階層の主な利点の1つは、最上位から継承された構成を拡張およびオーバーライドできることです。したがって、POM階層内の特定の要素またはアーティファクトの構成をオーバーライドするには、Mavenは次のようになります。対応するアーティファクトを一意に識別できます。

5. 効果的なPOM

有効なPOMは、スーパーPOMファイルのすべてのデフォルト設定とアプリケーションPOMで定義された構成を組み合わせます。 Mavenは、アプリケーションでオーバーライドされていない場合、構成要素のデフォルト値を使用します pom.xml [X247X ]。 したがって、最も単純なPOMセクションから同じサンプルPOMファイルを取得すると、効果的なPOMファイルは最も単純なPOMとスーパーPOMのマージであることがわかります。 コマンドラインから視覚化できます。

mvn help:effective-pom

これは、Mavenが使用するデフォルト値を確認するための最良の方法でもあります。

6. 結論

この短いチュートリアルでは、Mavenのプロジェクトオブジェクトモデルの違いについて説明しました。

いつものように、このチュートリアルに示されている例は、GitHubから入手できます。