TERASOLUNA5.xで覚えるべきMavenコマンド

## 1. はじめに
[TERASOLUNA Server Framework for Java (5.x) ](http://terasolunaorg.github.io/guideline/)ではビルドツールとして[Maven](https://maven.apache.org/)を利用します。今回はTERASOLUNA5.xのWebアプリ開発でよく利用する、覚えるべきMavenコマンドについて説明します。
なお、Mavenのインストール方法については「[WindowsにMaven(Proxy経由/NEXUS経由)をインストールする方法](http://qiita.com/5zm/items/cc13f09ffb8bd67d6246)」を参照ください。

### 1.1. 検証環境
* Java 1.8.0_131
* TERASOLUNA Server Framework for Java 5.3.0
* Apache Maven 3.3.9
* SonarQube 4.5.2

### 1.2. 覚えるべきMavenコマンド

| 項番 | やりたいこと | Mavenコマンド | 実行プロジェクト |
|:----:|:-----------|:--------------|:---------------|
| 1 | [ビルドする](#2-ビルドする) |`mvn package` | 親プロジェクト |
| 2 | [テストをスキップしてビルドする](#3-テストをスキップしてビルドする) |`mvn package -Dmaven.test.skip=true` | 親プロジェクト |
| 3 | [javadocを出力する](#4-javadocを出力する) |`mvn javadoc:javadoc` |domainプロジェクト |
| 4 | [JUnitテストを実行する](#5-junitテストを実行する) |`mvn test`|親プロジェクト|
| 5 | [Sonarによる静的ソースコード解析を実行する](#6-sonarによる静的ソースコード解析を実行する) |`mvn sonar:sonar` |親プロジェクト |

### 1.3. プロジェクト構成
今回は「[TERASOLUNA5.xのブランクプロジェクトをPostgreSQL対応に変更する方法](http://qiita.com/5zm/items/03915a7232fcbbd5768a)」で作成したプロジェクトを利用して説明したいと思います。

```console:説明で利用するプロジェクト構成
C:\work
    └─demo-database-postgresql               // 親プロジェクト
        ├─demo-database-postgresql-domain    // domainプロジェクト
        ├─demo-database-postgresql-env       // envプロジェクト
        ├─demo-database-postgresql-initdb    // initdbプロジェクト
        ├─demo-database-postgresql-selenium  // seleniumプロジェクト
        ├─demo-database-postgresql-web       // webプロジェクト
        └─pom.xml                            // 親pom
```

## 2. ビルドする
Javaファイルをコンパイルしてclassファイルを生成した後、jarファイルやwarファイルを作成することをビルドと呼びます。
TERASOLUNA5.xでは親プロジェクトで`mvn package`コマンドを実行することでビルドを行います。

```console:ビルドの実行結果
C:\work\demo-database-postgresql>mvn package
[INFO] Scanning for projects...

...省略...

[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] TERASOLUNA Server Framework for Java (5.x) Web Blank Multi Project (MyBatis3) SUCCESS [  0.016 s]
[INFO] demo-database-postgresql-env ....................... SUCCESS [  1.700 s]
[INFO] demo-database-postgresql-domain .................... SUCCESS [  0.375 s]
[INFO] demo-database-postgresql-web ....................... SUCCESS [  2.199 s]
[INFO] demo-database-postgresql-initdb .................... SUCCESS [  0.032 s]
[INFO] demo-database-postgresql-selenium .................. SUCCESS [  0.327 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.179 s
[INFO] Finished at: 2017-09-04T18:59:36+09:00
[INFO] Final Memory: 22M/54M
[INFO] ------------------------------------------------------------------------

C:\work\demo-database-postgresql>
```

## 3. テストをスキップしてビルドする
Mavenのビルド処理では、JUnitテストクラスがsrc/testディレクトリに含まれていた場合にこのテストを実行します。
テストを実行しないようにするには`maven.test.skip=true`システムプロパティを設定します。

```console:テストをスキップするビルドのコマンド
mvn package -Dmaven.test.skip=true
```

## 4. javadocを出力する
javadocを出力したい場合、`mvn javadoc:javadoc`コマンドを実行します。
デフォルトではdomainプロジェクトでjavadocを出力することができます。
webプロジェクトでもjavadocを出力したい場合は、プロジェクトの依存関係のエラーが出るので対応する必要があります。

```console
C:\work\demo-database-postgresql\demo-database-postgresql-domain>mvn javadoc:javadoc
[INFO] Scanning for projects...
...省略...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.388 s
[INFO] Finished at: 2017-09-04T20:13:24+09:00
[INFO] Final Memory: 16M/39M
[INFO] ------------------------------------------------------------------------

C:\work\demo-database-postgresql\demo-database-postgresql-domain>
```

生成されたjavadocは`domainプロジェクト/site/apidocs/index.html`で確認することができます。

## 5. JUnitテストを実行する
前述でMavenによるビルド処理でJUnitテストクラスのテストが実行されることを説明しました。
JUnitテストのみを実行したい場合、`mvn test`コマンドで実行することができます。

デフォルトでは親プロジェクトでJUnitテストを実行することができます。
javadoc同様、webプロジェクトのみやdomainプロジェクトのみ実行したい場合、依存関係のエラーが出るので対応する必要があります。

```console
C:\work\demo-database-postgresql>mvn test
[INFO] Scanning for projects...
...省略...
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
...省略...
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.183 sec

Results :

Tests run: 3, Failures: 0, Errors: 0, Skipped: 0
...省略...

C:\work\demo-database-postgresql>
```

## 6. Sonarによる静的ソースコード解析を実行する
[sonar](https://www.sonarqube.org/) による静的ソースコード解析を実行する場合、`mvn sonar:sonar`コマンドで行います。
**なお、このコマンドを実行するには、事前にSonarサーバを起動させておく必要があります。**

```console
C:\work\demo-database-postgresql>mvn sonar:sonar
[INFO] Scanning for projects...
...省略...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] TERASOLUNA Server Framework for Java (5.x) Web Blank Multi Project (MyBatis3) [ 24.196 s]
[INFO] demo-database-postgresql-env ....................... SKIPPED
[INFO] demo-database-postgresql-domain .................... SKIPPED
[INFO] demo-database-postgresql-web ....................... SKIPPED
[INFO] demo-database-postgresql-initdb .................... SKIPPED
[INFO] demo-database-postgresql-selenium .................. SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 25.039 s
[INFO] Finished at: 2017-09-04T21:39:37+09:00
[INFO] Final Memory: 39M/172M
[INFO] ------------------------------------------------------------------------

C:\work\demo-database-postgresql>
```

Sonarにはデモ用にインメモリデータベースであるh2dbが組み込まれています。
実際のシステム開発では、静的ソースコード解析の結果を保持し続けるため、Sonarの外部に専用のデータベースを用意することが一般的です。
その場合、システムプロパティでデータベースの接続情報を指定します。

```console:Sonar組み込みのh2dbではなく、PostgreSQLを利用する場合
mvn sonar:sonar -Dsonar.host.url=http://localhost:9000 -Dsonar.jdbc.url=jdbc:postgresql://localhost:5432/sonardb -Dsonar.jdbc.username=sonarUser -Dsonar.jdbc.password=sonarPass
```

| 項番 | システムプロパティ | 値 | 備考 |
|:----:|:-----------------|:---|:----|
| 1 | sonar.host.url | localhost:9000 |sonarサーバのURL |
| 2 | sonar.jdbc.url | jdbc:postgresql://localhost:5432/sonardb  |sonarの解析結果を格納するDB<br />ここではPostgreSQLを利用し、sonardbというデータベースを指定している |
| 3 | sonar.jdbc.username | sonarUser |2のdbに接続する際のユーザID |
| 4 | sonar.jdbc.password | sonarPass |2のdbに接続する際のユーザのパスワード |

## 7. さいごに
今回はTEARSOLUNA5.xのWebアプリの開発でよく利用するMavenコマンドについて説明しました。ここで説明した内容（ビルド、javadocの出力、JUnitの実行等）はJavaにおけるシステム開発では頻繁に利用するものばかりかと思います。

コマンドで実行できるということは、Jenkins等のCIサーバで実行できることを意味します。なるべくCIに組み込んで自動的に実行されるようにしましょう。

なお、ここで説明しているMavenコマンドは一般的なもののため、Mavenプロジェクトの設定がしっかりされていればTEASOLUNA5.x以外でも動作します。