【初心者向け】pom.xml基礎知識

Javaを学習している上で度々利用するpom.xmlが結局何なのか分からなかったので、自分なりに調べアウトプットのために投稿しました。
Javaを学習中の方にもお役に立てましたら幸いです。
（間違っている箇所がありましたら、ご指摘頂けると幸いです。💦）

## 目次


### ①pom.xmlとは

### ②pom.xmlの機能


## pom.xmlとは
:::note info
Mavenで作成したプロジェクトのビルド内容を設定するファイルの事！
:::

### ・Mavenとは
Maven は `Project Object Model (POM)` という考え方に基づき、、プロジェクト管理ツールとしてプロジェクトに関する色々な情報を POM に集約し、POMの情報に基づきプロジェクト全体を管理するツール。このMavenの主な機能としては、

:::note info
プロジェクトの作成・コンパイル・テスト・パッケージング、配備といった各タスクの支援。
:::

:::note info
プロジェクトサイトジェネレータ（HTMLで作成した静的なプロジェクトサイトの自動生成）
:::

:::note info
依存するライブラリの管理・ライブラリの自動インストール　★
:::

がある。

### ・ビルドとは
`ソースコードに問題（バグ）がないか解析を行い、問題がなければ実行できる形のファイルに変換し、組み立てること。`


#### ・解析
主に4つの解析がある。

:::note info
①静的解析：文法や構文の誤りを検出すること
:::
:::note info
②プリプロセッサ：定数の数値への置き換えやコメントの削除、マクロの展開。プリプロセッサを行わない言語もある。
:::
:::note info
③コンパイラ：人間が書いたソースコードを機械が読んで分かりやすい言語に変換。
:::
:::note info
④リンカ：各オブジェクトファイルやライブラリのリンクが行われ、全ての部品をリンクすることで、最終的に「実行ファイル」が完成する。
:::


## pom.xmlの機能
pom.xmlを全て知り尽くしてはいないので他にどんな機能があるかわかりませんが、
自分が一番便利だと感じたのは、

:::note info
依存するライブラリの自動インストール　★
:::

です！

### 実際の中身
```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.6.3</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<groupId>com.example</groupId>
	<artifactId>SpringBootSample</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>SpringBootSample</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>11</java.version>
	</properties>

　　　　　　　　　　<!-- ★ -->
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jdbc</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jdbc</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<scope>runtime</scope>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>com.h2database</groupId>
			<artifactId>h2</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		
		<!-- validator -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-validation</artifactId>
		</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
<dependencies>
〜
</dependencies>
```
内に追加したいライブラリを決められた形で記載し、実行 ->　Mavenインストールをするだけ！
（しないと反映されないっぽい）

自分の場合はSpring bootというJavaのフレームワークを使用した際、
jQueryとBootstrapをライブラリに追加する必要があったので、下記のように記載し実行したら、Mavenが勝手にインストールし、使えるようにしてくれました。✨

```xml
      <!-- jQuery -->
		<dependency>
			<groupId>org.webjars</groupId>
			<artifactId>jquery</artifactId>
			<version>3.5.1</version>
		</dependency>
		
		<!-- Bootstrap -->
		<dependency>
			<groupId>org.webjars</groupId>
			<artifactId>bootstrap</artifactId>
			<version>4.5.3</version>
		</dependency>
```

pom.xmlのタグと記載方法にはそれぞれしっかりとした意味があるようです。
ちなみに先程のdependenciesタグ内には、

`「このプログラムが、どのプログラムに依存しているか」に関する記述を行うタグ`

で、dependencyタグ内に、

`依存するライブラリ情報を具体的に記述していく`

という決まりがあるそうです。
それぞれのタグの意味は参考文献のサイトに記載がされていたので、調べてみると
pom.xmlの詳細が始めた時よりかは分かる様になると思います！！


## 結論
調べたら何だかすごく便利なものでした✨
今はまだ何となくではありますが、自分も徐々に理解していきます。



## 参考文献
■Maven基礎（プロジェクト生成とpom.xmlの読み解き）
https://ameblo.jp/bakery-diary/entry-12590391689.html#3

■第１回 Mavenって何？
http://objectclub.jp/technicaldoc/tools/maven/maven01#id15

■1. Maven とは
https://www.techscore.com/tech/Java/ApacheJakarta/Maven/1/

■Maven 2章　Maven 入門
https://www.techscore.com/tech/Java/ApacheJakarta/Maven/2-2/

■「ビルド」機能とは？仕組みやコンパイルとの違いを解説
https://proengineer.internous.co.jp/content/columnfeature/6308

■【Maven】pom.xmlの基本について（タグの意味について説明あり）
http://www.code-magagine.com/?p=2346