Spring Boot + Jenkinsのpom.xml設定例

# はじめに

このpom.xmlの設定例は、設定した内容の備忘録となります。

またこのpom.xmlは、『[Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発](http://www.shoeisha.co.jp/book/detail/9784798142470)』と『[Java本格入門](http://gihyo.jp/book/2017/978-4-7741-8909-3)』のサンプルコードを参考にIntelliJ IDEAで作成しました。

# 構成

## システム
* Spring Boot
* Thymeleaf
* PostqreSQL
* JPA

## Jenkinsで出力するレポート
* Checkstyle
* FindBugs
* JUnit
* JaCoCo

※JavaDocも出力するようにしていますがJenkinsのレポートにはまだ出力できるようにはしていません。

# pom.xml例
```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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>sample</groupId>
    <artifactId>sample</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>mrs</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <tomcat.version>8.5.15</tomcat.version>
        <thymeleaf.version>3.0.2.RELEASE</thymeleaf.version> <!-- ① -->
        <thymeleaf-layout-dialect.version>2.0.0</thymeleaf-layout-dialect.version> <!-- ① -->
        <assertj-core.version>3.6.2</assertj-core.version> <!-- ② -->
    </properties>

    <repositories>
        <repository> <!-- ③ -->
            <id>gemfire-repository</id>
            <name>Gemfire Repository</name>
            <url>http://repo.spring.io/plugins-release/</url> 
        </repository>
    </repositories>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</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.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency> <!-- ① -->
            <groupId>org.thymeleaf.extras</groupId>
            <artifactId>thymeleaf-extras-java8time</artifactId>
            <version>3.0.0.RELEASE</version>
        </dependency>
        <dependency> <!-- ① -->
            <groupId>org.thymeleaf.extras</groupId>
            <artifactId>thymeleaf-extras-springsecurity4</artifactId>
            <version>3.0.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <pluginManagement>
            <plugins>
                <plugin> <!-- ④ -->
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.20</version>
                    <configuration>
                        <argLine>-Xmx256m ${jacocoArgs}</argLine>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-checkstyle-plugin</artifactId>
                <version>2.17</version>
                <dependencies>
                    <dependency> <!-- ⑤ -->
                        <groupId>com.puppycrawl.tools</groupId>
                        <artifactId>checkstyle</artifactId>
                        <version>7.7</version>
                    </dependency>
                </dependencies>
            </plugin>
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.7.9</version>
                <executions> <!-- ⑥ -->
                    <execution>
                        <id>prepare-agent</id>
                        <phase>test-compile</phase>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                        <configuration>
                            <propertyName>jacocoArgs</propertyName>
                            <includes>
                                <include>*</include>
                            </includes>
                        </configuration>
                    </execution>
                    <execution>
                        <id>report</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>report</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    <reporting>
        <plugins>
            <plugin> <!-- ⑦ -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-project-info-reports-plugin</artifactId>
                <version>2.9</version>
                <configuration>
                    <dependencyLocationsEnabled>false</dependencyLocationsEnabled>
                </configuration>
                <reportSets>
                    <reportSet>
                        <reports>
                            <report>index</report>
                            <report>license</report>
                            <report>summary</report>
                            <report>dependencies</report>
                        </reports>
                    </reportSet>
                </reportSets>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-checkstyle-plugin</artifactId>
                <version>2.17</version>
                <configuration>
                    <configLocation>config/checkstyle/google_checks.xml</configLocation>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>findbugs-maven-plugin</artifactId>
                <version>3.0.4</version>
                <configuration> <!-- ⑧ -->
                    <xmlOutput>true</xmlOutput>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.7.9</version>
                <reportSets>
                    <reportSet>
                        <reports>
                            <report>report</report>
                        </reports>
                    </reportSet>
                </reportSets>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-javadoc-plugin</artifactId>
                <version>2.10.4</version>
                <configuration>
                    <source>${java.version}</source>
                    <encoding>${project.build.sourceEncoding}</encoding>
                    <docencoding>UTF-8</docencoding>
                    <charset>UTF-8</charset>
                </configuration>
                <reportSets>
                    <reportSet> <!-- ⑨ -->
                        <reports>
                            <report>javadoc</report>
                        </reports>
                    </reportSet>
                </reportSets>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jxr-plugin</artifactId>
                <version>2.5</version>
                <reportSets>
                    <reportSet> <!-- ⑩ -->
                        <reports>
                            <report>jxr</report>
                        </reports>
                    </reportSet>
                </reportSets>
            </plugin>
        </plugins>
    </reporting>
</project>
```

# 設定内容の説明

## ①Thymeleafのバージョン指定
Spring Bootの最新バージョンでは、Thymeleafのデフォルトが2だったので、3系を利用するためにVersionを指定しました。

## ②AssertJの利用
JUnit4のアサーションライブラリをAssertJに変更した。
AssertJの方がメソッドチェーンによりIDEの補完をフル活用できるのでテストコードを書くのに慣れていない我々には向いていると思ったため。
[AssertJ 使い方メモ](http://qiita.com/opengl-8080/items/b07307ab0d33422be9c5#%E5%8F%82%E8%80%83)

尚、spring-boot-starter-testのDependencyにAssertJが組み込まれているようなので、propertiesで指定すれば利用できる模様。

## ③Gemfireリポジトリを追加
GemfireプラグインがMavenリポジトリに無く、警告が出ていたため。
Gemfire自体はSpring Bootが利用している？（あくまで警告を無くすことが目的だったので、詳細は調べていません。）

## ④Surefireプラグインの設定
JaCoCoのレポートを出力する際の警告に対応するために記載しました。
詳細は下記のリンク先を参照してください。
[JaCoCoとMavenと何か](http://irof.hateblo.jp/entry/2016/10/05/013533)

## ⑤Checkstyleのバージョン指定
MavenのCheckstyleプラグインでは、Checkstyleのバージョンが6.11.2だったので、7.7で動作するようにVersionを追加しました。
[Upgrading Checkstyle at Runtime](https://maven.apache.org/plugins/maven-checkstyle-plugin/examples/upgrading-checkstyle.html)

## ⑥JaCoCoのレポート出力準備
Testフェーズでjacoco.exeを出力するため。
jacoco.exeからレポートを出力する。
尚、Jenkinsでレポートを表示させるだけなら、jacoco.exeが出力できればよくreport出力定義は不要だが、localで確認したい場合を考えてreportは出力できるようにする。

## ⑦site実行時のdependencyLocationsEnabledの指定
`mvn site`を実行するとリポジトリロケーションの解析に時間が掛る。`mvn site -Ddependency.locations.enabled=false`で実行すれば無効化できるが、いちいち入力したくなかったため設定を追加。
[maven の依存プロダクトのリポジトリロケーションの解析が遅いので無効化する](http://suer.hatenablog.com/entry/2012/05/29/091635)

また出力したいreportを制限するようにした。
[Apache Maven Project Info Reports Plugin](https://maven.apache.org/plugins/maven-project-info-reports-plugin/)

## ⑧FindBugsの出力レポート指定
`<xmlOutput>true</xmlOutput>`は、findbags.xmlを出力するため。
尚、上記設定に関係なくfindbagsXml.xmlというファイルが出力される。このファイルの用途などについてはまだ調べていません。

## ⑨TestコードをJavaDocで生成しない設定
`<report>javadoc</report>`を指定することで、mainディレクトリのソースのJavadocだけを生成することができる。指定していないとtestディレクトリのソースに対してもJacadocが生成されてしまう。

## ⑩jxrプラグインの設定
jxrは、projectのソースを相互参照するためのplugin。site実行時にソースコードをhtmlページで表示することができる。
[Maven JXR Plugin](http://maven.apache.org/jxr/maven-jxr-plugin/)
これもtestソースはhtmlかしないように`<report>jxr</report>`を指定した。

※このpluginを入れた本当の目的は、site実行時に以下の警告を回避するため。
`[WARNING] Unable to locate Source XRef to link to - DISABLED`
(checkstyleのレポート生成時で警告が発生している行がLinkになって該当ソースに飛べるのだが、ここでjxrを利用していると思われる。)

# まとめ

この設定でJenkinsでCheckstyle,JUnit,JaCoCoの結果が確認できた。
(FindBugsについてはコミットされているソースでエラーが無い状態だったのでレポートの出力確認はできていないが恐らく出力される。)

## 未解決

`man site`実行時に以下の警告が出力される。
`[WARNING] Unable to find a URL to the parent project. The parent menu will NOT be added.`

出力内容やタイミングから、親Pomになるspring-boot-starter-parentの設定と関係がありそうだが、未確認です。