【Webアプリ開発】Mavenの解説

#はじめに
DreamHanksの松下です。今回はMavenの解説をしていきます。

[連載記事まとめ](https://qiita.com/DreamHanks/items/7df703a509ef22f64d2c)

こちらの記事は下記の記事の補足説明です。
[【第二回】SpringとMySqlとMyBatisの連動方法](https://qiita.com/DreamHanks/items/f80d27d42c3b9f895e61)



#ビルドツールとは
ビルドツールは、ソースコードからの実行可能アプリケーションの作成を自動化するプログラムです。

今回解説するMavenはpom.xml(Project Object Model)に基づきプロジェクトのライフサイクル全体を管理するものです。

#Mavenビルドライフサイクルとは

####一般的に「ビルドをする」ということは下記の３つのことを言います。
　①作ったソースコードをコンパイルする
　②モジュールをWARファイルに圧縮する
　③Webアプリケーションサーバにデプロイ（配置）する

しかし実際にはビルドツールはもっと細かい作業を行っています。
ここではその細かい作業とは何があるかを解説していきます。

>仕事として「ビルドをする」という言葉を聞いた場合は
上記の3つのことを言っていると覚えておいてください。


###Mavenビルドライフサイクル：イメージ図

![Mavenビルドライフサイクル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/a5df6569-1ffd-d4e7-d3b0-610d50a9af52.png)


Mavenのビルドライフサイクルを通ることで安全かつ、自動的にインストールor公開ができます。


######◆①pomの作成段階
下記の命令文を使って、pom.xmlの検証やリソースの生成を行います

| 種類| 内容
|:-----------|------------|
| validate| 正しい入力値を入力されたかを検証する
| generate-resources| パッケージに含むリソースを生成する
| process-resources| リソースを配布用ディレクトリにコピーする



######◆②コンパイル段階
下記の命令文を使って、コンパイルなどを行います。

開発したWebアプリをローカルリポジトリにインストールした後に、ソースの修正をした場合
「①pomの作成段階」からではなくこの段階からライフサイクルを回します。

| 種類| 内容
|:-----------|------------|
| compile| ソースコードのコンパイルを行う



######◆③テスト段階
実はMavenを使うことによって単体テストを行うためのソースコードをjunitというテストツールに作る必要がありますが
単体テストを自動化することができます。

開発したWebアプリをローカルリポジトリにインストールした後に、動作確認中に不具合が発生した場合
テストするためにこの段階からライフサイクルを回します。

単体テストをするためのモジュールがない場合は、この段階はスキップします


| 種類| 内容
|:-----------|------------|
| generate-test-sources| コンパイルに含むテストソースコードを生成する
| process-test-sources| テストソースコードに対して処理を行う（フィルタリングなど）
| generate-test-resources| テスト用リソースを生成する
| process-test-resources| リソースをテスト用ディレクトリにコピーする
| test-compile| テストソースコードをコンパイルする
| process-test-classes| コンパイルで生成したテスト用ファイルに対して後処理を行う（バイトコードの拡張など）
| test| ユニットテストを行う



######◆④パッケージング段階
下記の命令文を使って、モジュールをwarファイルに圧縮、モジュール全体の結合テストを行います。

| 種類| 内容
|:-----------|------------|
| prepare-package| パッケージングの前段階の処理で、ここではパッケージングはされない
| package| コンパイルコードのパッケージング(jarなど)を行う
| pre-integration-test| 統合テストの前処理で、必要な環境のセットアップなどを行う
| integration-test| 統合テストを行う
| post-integration-test| 統合テストの後処理で、環境のクリーンなどを行う
| verify| パッケージが有効であること、品質基準を満たしていることをチェックする



######◆⑤インストール段階
下記の命令文を使って、ローカルのWebアプリケーションサーバに
パッケージされたWarファイルをデプロイ（配置）を行います。


| 種類| 内容
|:-----------|------------|
| install| ローカルリポジトリにインストールする



######◆⑤公開段階
開発したWebアプリはリモートのWebアプリケーションサーバに
パッケージされたWarファイルをデプロイ（配置）します。

自分で開発したライブラリをMVNリポジトリにデプロイすることもできるようです。

| 種類| 内容
|:-----------|------------|
| deploy| リモートリポジトリにデプロイする


######◆ドキュメンテーションについて
これはライフサイクル外の話です。
覚えておくと、自分の開発しているモジュールを分析をするときに役に立ちます。

◆javadocの作成とは
モジュールの下記のような/** */で囲われたコメントの＠paramなどのアノテーションに定義されている
コメントを読み取り、下記の画像のように自分の作ったモジュールのjavadocを作ることです。


	/**
	 * ログイン画面を開くためのメソッド
	 * @param loginForm クライアント側でloginFormを使えるようにする空クラス
	 * @param model ControllerからViewに値を受け渡すためのパラメータ
	 * @return  ログイン画面のJSPファイル名
	 */


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/ab23aa9f-f344-916f-d32d-35812c63f02b.png)

javadocの作成の命令文

```
mvn javadoc
```



◆サイトの作成とは

下記の画像のようにモジュールが
どのようなライブラリやプラグインを使っているのかを分析できるサイトを作ることです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/20ec53af-0213-aa0c-85b7-08c6f969e723.png)

サイトの作成の命令文

```
mvn site
```



#実行方法
①「mvn + 上記の表の命令コマンド」
例）[mvn test]とやることで、コマンドプロンプトなどからコマンド実行ができます。

②下記のようにeclipseから実行することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/e9a9f09c-c21e-671b-6442-ed5d7c82c1cd.png)

しかし個々にMavenの命令文を実行する必要はありません。
・「全てビルド」をする
・「自動的にビルド」にチェックを入れておくだけで、ソースを保存するたびに
　eclipseが内部でmvnの命令文を全て実行してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/8d7ddbcb-f572-9841-133d-d6fd47900d3a.png)

これをすることでとても便利にMavenを使うことができますが、
普段はMavenを意識するする必要がなくなり、pomの設定も始めから用意されている開発しか経験をしないと
Mavenってなに？、ビルドツールってなに？という人が誕生してしまいます。



#Mavenの仕組み
Mavenビルドライフサイクルのイメージ図ある「リモートリポジトリ」とは具体的に下記のサイトのことです。
[Mavenのリモートリポジトリ](https://mvnrepository.com/)

このサイトから「ライブラリ」をダウンロードして、ローカルで使えるようにします。

「プラグイン」は上記のサイトではなく、そのプラグインを提供している公式サイトからダウンロードします。
[（例）MyBatis Generator](http://mybatis.org/generator/running/runningWithMaven.html)


#pom.xmlの構成解説

###◆上部の解説
```php
<?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/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.dreamhanks</groupId>
	<artifactId>workmanager</artifactId>
	<name>WorkManager</name>
	<packaging>war</packaging>
	<version>1.0.0-BUILD-SNAPSHOT</version>
	<properties>
		<java-version>1.6</java-version>
		<org.springframework-version>3.1.1.RELEASE</org.springframework-version>
		<org.aspectj-version>1.6.10</org.aspectj-version>
		<org.slf4j-version>1.6.6</org.slf4j-version>
	</properties>
```

| 種類| 内容
|:-----------|------------|
| modelVersion| POM のバージョン。 特に変更する必要はありません。
| groupId| プロジェクトを一意に識別する名前。 プロジェクトのルートパッケージ名を指定するのが一般的です。
| artifactId| プロジェクトの成果物の名前。 作成する JAR や WAR, EAR ファイルなどの名前に使用されます。
| packaging| 作成する成果物のパッケージング・タイプ。 jar (デフォルト), war, ear などがあります。
| version| プロジェクトのバージョン。
| name| プロジェクトの表示名。 ドキュメントを作成するときなどに使用されます。
| url| プロジェクトのサイトの URL。 ドキュメントを作成するときなどに使用されます。
| dependencies| プロジェクトが依存するライブラリの情報。

#####warファイルとは
Webアプリケーションの圧縮ファイル。
このwarファイルをWebアプリケーションサーバにデプロイ（配置）することでアプリケーションを公開（動かすこと）ができる。

#####Webアプリケーションサーバとは
アプリケーションの実行環境。代表的なものがapach tomcat。

###◆ライブラリの解説
```php
<dependencies>
　　<!-- MySQL -->	
　　<dependency>	
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>8.0.11</version>
　　</dependency>	

　　ほしいライブラリを定義していく
　　　・
　　　・
　　　・

</dependencies>
```

#####dependencyとは
ライフサイクルにおけるリモートリポジトリからライブラリをローカルリポジトリにインストールするということです。
簡単に言うと、このdependenciesタグ内にほしい外部ライブラリを定義することによってMavenが外部からダウンロードしてくれます。

このようにMaven依存関係フォルダを見ると、ダウンロードされていることがわかります。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/bcd09af6-2e79-9e4d-00f9-7a13eaa48e79.png)
　　　

>その他にライブラリの追加は下記の方法があります。
　・マーケットプレイスからダウンロードする方法
　・MVNリポジトリ（Mavenのリポジトリサイト）から直接ダウンロードして、Mavenの依存関係フォルダに配置する方法

###◆プラグインの解説

```php
<plugins>										
	<plugin>									
		<artifactId>maven-eclipse-plugin</artifactId>								
		<version>2.9</version>								
		<configuration>								
			<additionalProjectnatures>							
				<projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>						
			</additionalProjectnatures>							
			<additionalBuildcommands>							
				<buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>						
			</additionalBuildcommands>							
			<downloadSources>true</downloadSources>							
			<downloadJavadocs>true</downloadJavadocs>							
		</configuration>								
	</plugin>	
   ほしいプラグインを定義していく
　　　・
　　　・
　　　・
     							
</plugins>
```

#####pluginとは
ライフサイクルにおけるリモートリポジトリからプラグインをローカルリポジトリにインストールするということです。
簡単に言うと、このpluginsタグ内にほしい外部プラグインを定義することによってMavenが外部からダウンロードしてくれます。

#最後に
最新内容については下記のリンク（DreamHanksのブログ）で確認することができます。
[DreamHanksブログ（Javaウェブアプリ開発）](http://blog.dreamhanks.com/java%e3%82%a6%e3%82%a7%e3%83%96%e3%82%a2%e3%83%97%e3%83%aa%e9%96%8b%e7%99%ba/)