Gradle 3.0 のリリースノートまとめ

2016/8/15 に、Gradle の新しいバージョン 3.0 がリリースされましたので、自分の勉強も兼ねて（というかこっちがメイン）[リリースノート](https://docs.gradle.org/current/release-notes)に記載されている内容を簡単にまとめてみようと思います。

ちょっと自分のGradleに対する理解が足りておらず、うまく書けない項目もあるので、そのあたりは調べながら随時更新・修正予定です。

# 新機能

## Gradleデーモンが改善され、デフォルトで有効になるよう変更されました

Gradleデーモンは、プロジェクトのビルドに必要なリソースをキャッシュし、ビルドの実行を常に待機する仕組みです。
繰り返しビルドを実行するような状況では、Gradleデーモンを使うことでGradle自体の起動に必要なオーバーヘッドやコストを削減できるため、ビルドを効率的にできるようになります。

このGradleデーモンは今まで設定を有効にしないと使えなかったのですが、3.0からはデフォルトで有効になるよう変更になりました。

## Gradleデーモンのステータスを確認できるようになりました

$ gradle --status で、今までは確認できなかったGradleデーモンのステータスも表示できるようになりました。
これによって、「なぜデーモンがストップするのか」といった状況の把握がしやすくなりました。

## GradleデーモンについてもBuild Scanができるようになりました

Build Scans はビルドの状況をWebブラウザで詳細に確認することができる仕組みで、このBuild ScanがGradleデーモンについてもできるようになりました。
これによって、上記の「なぜデーモンがストップするのか」といった問題の原因や、ビルドが開始されたタイミング、システム上で起動しているデーモンの数、等、詳細なGradleデーモンの状態を把握することができるようになります。

## KotlinでのGradleのビルドスクリプトのコーディングが快適になりました

Kotlinでビルドスクリプトを記述する際のIDE（Eclipse、IDEA）によるサポートが強化され、コートコンプリート、リファクタリングなどが快適に行われるようになりました。

## タスクの並列実行が改善されました

max-workers の設定により、同時に実行できるタスクの最大数を決めることができるようになったおかげで、Gradleが使用するリソースを管理しやすくなりました。

## Java9のサポート

Java9でのGradle実行、コンパイル、テスト実行、アプリケーションの実行をサポートしています。
ただし、いくつかのpluginについて問題がすでに報告されていることや、continuous build を使用した際、ファイルの変更の検知が遅れるなどの制限があります。

## DLSプラグインの改善

TODO: 書く

## Incremental build の改善

TODO: 書く

## 依存関係の解決の高速化

すでにダウンロード済みの外部ライブラリの依存関係の解決が5～10％速くなりました。

## eclipse-wtpプラグインの改善

TODO: 書く

## Eclipseプロジェクトモデルの新機能

TODO: 書く

## Gradleプラグインが使用するライブラリのアップグレード

TODO: 書く

# 非推奨になったもの

Gradleの進化に沿わなくなった機能はDeprecatedとなり、次のメジャーバージョンアップ（4.0）で削除される予定です。

## TaskInputs / TaskOutputsメソッドのチェイン

以下のメソッドをチェインするのは非推奨にりました。

* TaskInputs.dir()
* TaskInputs.file()
* TaskInputs.files()
* TaskOutputs.dir()
* TaskOutputs.file()
* TaskOutputs.files()

例）

```
task myTask {
    inputs.file("input1.txt").file("input2.txt")
}
```

## Jetty Plugin

Jettyプラグインが廃止されます。
代わりに、より機能が豊富なGrettyプラグインを使用してください。

# 既存の環境に影響の出る可能性のある変更

## Java6でのGradle実行がサポートされなくなりました

Gradle自体の実行にはJava7が必須になりました。
ソースコードのコンパイルやテストの実行については、引き続きJava6がサポートされますが、いくつか制約があります。

## Java5でのコンパイルやテストがサポートされなくなりました

## Sonarプラグインのサポートが終了しました

Sonarの古いプラグインが削除され、現在はSonarQubeの公式プラグインを使用するようになりました。

## eclipse-cdtプラグインのサポートが終了し、削除されました

## Testタスクの結果やレポートの出力先が変更されました

Javaプラグインを使用した際のTestタスクの結果ファイルやレポートファイルのデフォルトの出力先が変更されました。これにより、複数のTestタスクの結果やレポートファイルの出力先の競合の回避のために設定を入れる必要がなくなります。

逆に、過去のバージョン通りの出力が必要な場合は明示的に設定を追記する必要があります。

```
test.reports.html.destination = testReportDir // build/reports/tests
test.reports.xml.destination = testResultDir // build/test-results
```

## AntベースのScalaコンパイラが削除されました

AntベースのScalaコンパイラが削除されました。Gradle3.0ではZinc Scala Compilerを使用します。

## TestNGのJavadocアノテーションのサポートが削除されました

## インターフェイスでのタスクプロパティへのアノテーションが考慮されるようになりました

以前のバージョンでは、 @InputFile や @OutputDirectoryなどのタスクプロパティへのアノテーションは、実装クラス（もしくはその親クラス）でのみ有効でしたが、Gradle3.0からはインターフェイスでも考慮されるようになりました。

## eclipse-wtp の外部依存関係のハンドリング方法が変更されました

Javaプロジェクトにおいて、eclipse-wtpプラグインは外部の依存ライブラリをWTPコンポーネントファイルではなくクラスパスに追加するようになりました。
それに伴い、eclipse.wtp.component.file で指定されていた外部依存ライブラリのカスタマイズ設定はeclipse.classpath.file に移動する必要があります。

## warやearプロジェクトで、eclipse-wtpが自動的に適用されます

eclipseプラグインと同時にwar, earプラグインを宣言すると、eclipse-wtpプラグインも自動的に適用されるようになりました。無効にしたい場合は、以下の設定を追記する必要があります。

```
eclipse.project {
    natures.removeAll { it.startsWith('org.eclipse.wst') }
    buildCommands.removeAll {         
        it.name.startsWith('org.eclipse.wst')
    }
}
```

## Eclipseモデルが依存ライブラリのクラスパス属性を保持するようになりました

EclipseProjectDependency と EclipseExternalDependencyは、ClasspathAttributeを保持するようになりました。デフォルトではJavaDocの場所やWTPデプロイメントの場所なども保持しています。

## NamedDomainObjectContainers が、explicit parameter syntaxで書かれたオブジェクトを生成しないようになりました

以前は以下の書き方でSourceSetsオブジェクトが生成できましたが、Gradle3.0ではこの挙動は削除され、例外を投げるようになりました。

```
sourceSets {
    it.foo {}
}
```

代わりに、以下のように書いてください。

```
sourceSets {
    foo {}
}
```

## Groovy から Javaへの変更

TODO: 書く

***

ひとまず、ざっと書けるところまで書いてみました。
直訳では意味がよく分からない部分や、そもそもこの仕組み何？って部分も少なからずありましたので、引き続き調べて追記・修正していきたいと思います。