Play Framework 2.3でCheckStyle,FindBugs,JaCoCo,PMD,CPDのレポート出力

PlayもSBTもよくわかっていない初心者がPlayFramework2.3(Java)プロジェクトの品質管理に取り組んだメモ。

Play2.2で苦労して作り上げた設定は見事撃沈。
[PlayFramework2.2でCheckStyle,FindBugs,JaCoCo,PMD,CPDのレポート出力](http://qiita.com/tamaco/items/dffc190e34d970512663)

# やりたい事

PlayFramework2.3(Java)で作成したソースに対して下記レポート出力する。
JenkinsのJobでも同様のレポートを出力し、表示できるようにする。

* CheckStyle
* FindBugs
* JaCoCo
* PMD
* CPD

※JDK1.7対象
## project/plugins.sbtの編集
※改行を挟まないと有効にならない箇所があるので注意。

```project/plugins.sbt
resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/"

resolvers += "sbt community repository" at "http://dl.bintray.com/sbt/sbt-plugin-releases/"

resolvers += "corux-releases" at "http://tomcat.corux.de/nexus/content/repositories/releases/"

resolvers += "corux-snapshots" at "http://tomcat.corux.de/nexus/content/repositories/snapshots/"

// The Play plugin

addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.3.4")

// web plugins

addSbtPlugin("com.typesafe.sbt" % "sbt-coffeescript" % "1.0.0")

addSbtPlugin("com.typesafe.sbt" % "sbt-less" % "1.0.0")

addSbtPlugin("com.typesafe.sbt" % "sbt-jshint" % "1.0.1")

addSbtPlugin("com.typesafe.sbt" % "sbt-rjs" % "1.0.1")

addSbtPlugin("com.typesafe.sbt" % "sbt-digest" % "1.0.0")

addSbtPlugin("com.typesafe.sbt" % "sbt-mocha" % "1.0.0")

// Use the Play sbt plugin for Play projects

addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.2.3")

addSbtPlugin("de.johoop" % "jacoco4sbt" % "2.1.6")

addSbtPlugin("de.johoop" % "findbugs4sbt" % "1.3.0")

addSbtPlugin("de.johoop" % "cpd4sbt" % "1.1.5")

addSbtPlugin("de.johoop" % "sbt-testng-plugin" % "3.0.2")

addSbtPlugin("de.corux" %% "sbt-code-quality" % "0.2.0")

libraryDependencies ++= Seq(
  "net.sourceforge.pmd" % "pmd" % "5.1.3" exclude("org.ow2.asm", "asm")
)
```


##プロジェクトフォルダ直下にbuild.sbtファイルを作成する。

``` build.sbt
name := "example-project"

version := "1.0-SNAPSHOT"

lazy val root = (project in file(".")).enablePlugins(PlayJava)

scalaVersion := "2.11.1"

jacoco.settings

findbugsSettings

cpdSettings

cpdLanguage := de.johoop.cpd4sbt.Language.Java

testNGSettings

codequality.CodeQualityPlugin.Settings
```

###ハマりどころ～CheckStyle編～

Play2.2では動いていたsbt-checkstyle-pluginがうまく動かず。
色々試してみたが解決できず、CheckStyleをかけてくれる別のプラグインを発見。
sbt-code-qualityに変えてみたら出力された。

CheckStyleのルールセットはプロジェクト直下にcheckstyle-config.xmlという名前で保存する。
（名前は変えられるらしい）

使用したsbtプラグイン
https://github.com/corux/sbt-code-quality
これ１つでCheckStyleとPMDを実行できる。

CheckStyle実行すると下記エラー発生。

```
[error] (*:checkstyle) java.lang.NoSuchMethodError: com.google.common.collect.ImmutableSortedSet.of([Ljava/lang/Comparable;)Lcom/google/common/collect/ImmutableSortedSet;
```

CheckStyle5.5とPlay2.2(以降？)で起きる不具合らしい。
checkstyle-config.xml内のJavaDocstyleのチェックをコメントにすることでとりあえず解消。

###ハマりどころ～PMD編～

``activator pmd``を実行すると、java.lang.IncompatibleClassChangeErrorが出てpmd.xmlが0バイトで作成される。
``project/plugins.sbt``に下記記述を追加することで解決した。

```
libraryDependencies ++= Seq(
  "net.sourceforge.pmd" % "pmd" % "5.1.3" exclude("org.ow2.asm", "asm")
)
```

参考URL
http://stackoverflow.com/questions/26260616/why-does-play-2-3-4-and-jacoco4sbt-2-1-4-fail-with-nosuchmethoderror

PMDのルールセットはプロジェクト直下にpmd-ruleset.xmlという名前で保存する。

###ハマりどころ～CPD編～

Play2.2に引き続き、CPDを実行しても出力されるレポートが0byte。
今回は諦めずに挑戦。
CPDプラグインがデフォルトでチェックする言語はScalaになっている？という可能性に気付き、言語設定を適当に入れてみたら出力された。

```
cpdLanguage := de.johoop.cpd4sbt.Language.Java
```

##Jenkinsの設定

####ビルド→シェルの実行

```
cd ${WORKSPACE}/example

activator jacoco:cover
activator checkstyle
activator findbugs
activator pmd
activator cpd
```

####ビルド後の処理

- Checkstyle警告の集計

``` 
example/target/checkstyle-result.xml
```

- Findbugs警告の集計
 
``` 
example/target/scala-2.11/findbugs/report.xml
```

- PMD警告の集計

``` 
example/target/pmd.xml
```

- 重複コード分析の集計

``` 
example/target/scala-2.11/cpd/cpd.xml
```

#まとめ

育ちざかりのフレームワークについていけない。
Play2.2での設定がうまく動くまでと同じくらい時間がかかった。
レポートの出力はできるようになったが、出力されたレポートの内容までは確認できていない。
色々調整が必要かも。

参考URL
https://www.playframework.com/documentation/2.3.x/Migration23