[リサーチ・メモ] Mavenとは

## 背景
仕事でeclipseを使用して、「Maven install」や「Maven clean」を実行したが、正直Mavenが何者なのか理解せず、何となく使用していた為整理する。

## Mavenとは
Javaのプロジェクト管理ツール
Project Object Model (POM) という考え方に基づき、プロジェクトのビルド、テスト、ドキュメンテーション、成果物の配備など、プロジェクトのライフサイクル(計画、設計、実装、テスト、デプロイ、メンテナンス)全体を管理するもの。

## POMとは
XML形式のファイル（通常pom.xmlという名前）に記述され、プロジェクトのビルド設定や依存関係、プラグイン、プロジェクト情報（例：プロジェクト名、バージョン、作者等）など、プロジェクトに関するすべての情報を定義する。
MavenはPOMを読み込み、定義に従ってプロジェクトをビルドすることにより、開発者は複雑なビルドプロセス(ソースコードから実行可能なソフトウェアアプリケーションまたはシステムを作り出す一連の手続き)を簡単に管理し、また他の開発者がプロジェクトを理解しやすくすることが可能になる。

### pom.xmlの構成
```
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.4.1</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>プロジェクト名</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>プロジェクト名</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
            <dependency>
               <groupId>org.glassfish.jersey.core</groupId>
               <artifactId>jersey-client</artifactId>
               <version>2.32</version>
           </dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<excludes>
						<exclude>
							<groupId>org.projectlombok</groupId>
							<artifactId>lombok</artifactId>
						</exclude>
					</excludes>
				</configuration>
			</plugin>
		</plugins>
	</build>

</project>

```


| 要素 | 内容 |
|:-:|:-:|
| ?xml version="1.0" encoding="UTF-8"?  | XML宣言  |
| project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"  | <project>エレメントの開始タグ  |
| modelVersion  | POMモデルのバージョンを指定  |
| parent  |   親プロジェクトを定義 |
|  groupId |  プロジェクトが属するグループや組織を識別するための識別子で、通常は組織のドメイン名を逆にしたものを使用 |
|  artifactId | プロジェクトの一意な名前を示す識別子で、Mavenリポジトリ内でプロジェクトを一意に識別するために使用  |
|  version | プロジェクトのバージョンを定義  |
|  name | プロジェクトの名前  |
| description  | プロジェクトの説明  |
|  properties | プロジェクトで使用するプロパティを定義  |
|  dependencies |  プロジェクトが依存するライブラリやフレームワークを定義 |
|  dependency |  それぞれの依存関係を定義 |
|  build |  ビルドに関する設定を含むセクション。プラグインの設定や、ビルドのデフォルト設定などを定義 |
|  plugins | プロジェクトで使用するMavenプラグインのリストを定義するセクション  |
|  plugin |  個々のMavenプラグインの設定を定義 |
|  groupId・artifactId |  プラグインの一意の識別子 |
|  configuration |  プラグインの設定 |
|  excludes | プラグインから除外されるべきアーティファクトのリストを定義  |
|  exclude |  除外されるべき個々のアーティファクトを指定 |

## コマンドが実行していること
|コマンド|内容|
|:-:|:-:|
|maven clean|プロジェクトのビルド時に生成されたファイルを削除することで、ビルドプロセスを"クリーン"な状態に戻す。具体的には、targetディレクトリ内のファイルが削除される。|
|maven generate-sources|追加のソースコードを生成するために使用される。これは、特定のプラグイン（例えば、JAXBやSwaggerなど）が必要とするソースコードを生成するためのフェーズである。|
|maven install|プロジェクトをビルドし、生成されたアーティファクト（例えば、JARファイルなど）をローカルリポジトリにインストールする。これにより、他のローカルのMavenプロジェクトがこのプロジェクトを依存関係として使用できるようになる。|
|maven test|ユニットテストの実行を行う。このフェーズでは、通常JUnitやTestNGのようなフレームワークを使用してプロジェクトのソースコードに対するユニットテストが実行さる。|