【2021年】Maven-Gradleについてリサーチした

# 目次
- ビルドとは
- ビルドツールとは
- 依存関係とは
- ビルドの歴史
- Maven
- Gradle
- まとめ
- 参考

# Maven, Gradleとは
Maven, Gradleとはビルドツールである。

# ビルドとは
- 「要求された実行環境で動作できる形式にアプリケーションやライブラリを組み立てる」こと 
- 本来ビルドには「決まりのある作業を行う」という意味があるが、エンジニア目線で言うと「要求された環境に合わせて適切に導入し動作を安定させる」という意味がある 
- Javaの場合だと、「.java」→「.class」ファイルにコンパイル、「.jar」ファイルに固める+α、サーバーにデプロイする...など

# ビルドツールとは
- 要求された実行環境で動作できる形式にアプリケーションやライブラリを組み立てる（ビルド）するツール 
- プロジェクトのビルド、テスト、ドキュメンテーション、成果物のデプロイなど、プロジェクトのライフサイクル全体を管理するもの 
- プロジェクトの依存するライブラリの管理をする

# 依存関係とは
- ある要素が別の要素の存在や完了などを前提としている関係のこと。主にソフトウェア間の関係やプロジェクト管理におけるタスク間の関係を表すのに用いられる。 
- ソフトウェアやプログラミングの分野では、あるプログラムのビルドや実行のために、別のプログラムが必要であることを依存関係と呼ぶ。 
- 例えば、あるプログラムが別のモジュールの機能を利用しており、実行ファイルにビルドするには開発環境にそのモジュールを導入する必要がある場合や、実行ファイルが外部の動的リンクライブラリの機能を呼び出すようになっており、実行環境にライブラリを導入する必要がある場合などが該当する。 
- あるプログラムが依存するプログラムを取り寄せ、そのプログラムが依存するプログラムを取り寄せ…という作業を必要なプログラムが揃うまで繰り返す作業を「依存関係の解決」という。ビルドツールやパッケージ管理システムなどの開発ツールには、プログラム菅野依存関係を自動的に認識して解決する機能を内臓しているものもあります。

# ビルドの歴史①
ビルドツールは初めから今のように完成されていたわけではなく、以下のようにさまざまな段階を経て現在のビルドツールが生まれました。 
1. 手動ビルド 
2. ビルドスクリプト 
3. ビルドツール

## 
1:手動ビルド ビルドツールが無い時代はエンジニアが手動で大量のビルドをしていました。 この時は経験の浅い方が業務を担当していたこともあったみたいですが人件費が無駄にかさんだり開発で新しいライブラリを求めるたびに多数の工程がが発生し余計なコストがかかっていました。

2:ビルドスクリプト
ビルドで発生する作業のうちコマンドでできる作業をコマンドファイルやシェルスクリプトにまとめ動作させるだけで作業を完了させることができました。 人による人為的なミスを減らせることはできたのですが、コンパイルの回数が増えてしまいます。 シェルスクリプトは決まりきった処理の内容を記述するというビルドスクリプトの要請には応えますが、ビルドを構成するタスク同士の依存関係やタスクの実行要否を判断するための状態管理までは行えません。

3:ビルドツール
ライブラリやビルドを構成するタスク間の依存関係の管理をすることができ、自動的にファイルを監視してタスクを実行できるようになりました。

# Maven
## Mavenの特徴
- プラグイン拡張によりさまざまな使い方ができる。
- ソースコードのコンパイル、テスト、Javadoc生成、テストレポート生成、プロジェクトサイト生成、JAR生成、サーバへのデプロイが用意されており、大まかな指示を`pom.xml`に記述して処理する形となっている。
- `pom.xml`の`<dependency>`タグにプロジェクトで使用したいJARライブラリ名及びバージョンを指定することで、外部サイトで集中管理されているJARを自動ダウンロードし、ローカルでビルドに使用することができる。 JARを手動で一つずつDLして設定する旧来の手法と比較して、容易にライブラリを管理・アップデートできる。
- 例えば、開発チームでプロジェクトを共有したいとき、JARファイルをわざわざ他者に手動でDL、インストール、アップデートさせる手間も省くことができる。

参考：pom.xml  
  POMとは、「Project Object Model」の略で、プロジェクトのさまざまな情報を扱うためのオブジェクトモデルです。
![pom.xml.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867775/290f6b3d-8a80-622e-27d1-8ceb9915cb73.png)


# Gradle
## Gradleの特徴
- Mavenが利用するXML形式ではなく、Groovy(Javaに似た言語)形式
- マルチプロジェクトのビルド用に設計されており、ビルドフリーのどの部分が最新であるかをインテリジェントに決定する増分ビルドをサポートする。このため、最新の増分ビルド部分に依存するタスクを際実行する必要は一才ない。
- `build.gradle`というファイルで依存関係を制御する。
- 複数のプロジェクトを管理するのに向いている。

## Gradleの各ファイル紹介
### `build.gradle`
![build-gradle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867775/cb324c3c-cdc8-af70-5be2-226644531d71.png)

依存関係やタスクを定義するファイルです。 コードに記述されている`org.~`は、そのプロジェクトに必要なモジュールの取得先（Mavenリポジトリ）を示しています。

### `gradlew`(Gradle Wrapper スクリプト)  
![gradlew.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867775/61f52147-2acf-b718-8ee8-2aa6fadb2fb3.png)

昔、ビルド職人が記述していたビルドスクリプトの雛形として自動生成されたものです。 `gradle wrapper`というコマンド実行で作成できます。
※VSCodeのプラグインの`SpringBoot ExtensionPack`の機能を使用してプロジェクトを作成した場合は`gradle wrapper`コマンドを使用しなくても自動で生成されます。

※WindowsOSの場合はgradlewの代わりにgradlew.batが使用されます。

### `gradle/wrapper/~`
![gradle-wrapper.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867775/ce0aae6a-9975-2738-7bd4-d0be5fb9acf3.png)

gradleが走った際に生成されるJARファイル群の格納場所です。下記のファイルが生成されています。
- `gradle-wrapper.jar`
- `gradle-wrapper.propaties`

# まとめ
- Maven,Gradleはビルドツールである
- ビルドとはコンパイル、デプロイなど開発に必要な各タスクを実行すること
- ビルドツールとはビルドを自動で実行したり依存関係を管理してくれるツール
- Mavenはpom.xmlで、Gradleは`build.gradle`のファイルで依存関係などを設定する

# 参考
【入門】Gradle とは？ Maven リポジトリで Dependencies を解決  
 https://hogetech.info/2020/09/23/gradle-%E5%85%A5%E9%96%80/ 

【初心者必見】Mavenまとめ
 https://qiita.com/enzen/items/8546357f4e67357fe730