gradle initもEclipseも使わずJavaプロジェクトを作成する

GradleでJavaプロジェクトを新しく作ろうと思ったとき、「Gradle Java プロジェクト作成」でググると、どうにもEclipseを使ったり、 ```init --java-library``` を使ったりと、必要最低限以上のものがくっついてくる方法ばかり出てくるので、Gradleの理解のためにもユーザーガイドを見ながら必要最小限のJavaプロジェクトの作り方を調べてみました。

たぶん仕事等でこの通りやることは少ないと思いますが、どこまでがGradleのお作法でどこからが便利部分なのかを理解するのにはちょうど良いかと思います。

ちなみに、この記事の内容はほぼユーザーガイドの [Chapter 45. The Java Plugin](https://docs.gradle.org/current/userguide/java_plugin.html) の要約です。

## 前提

作成するのはコンソール上で動作する一番基本的なJavaアプリケーションです。
```public static void main(String args[])``` を含んだクラスから始まり、なんだかんだやってCUI上で完結するようなプログラムです。
クローラーによるデータ作成とか、DBのバッチ処理とか、そんな感じで使ったりする感じですね。
（JARで固めたライブラリを作りたい、という場合も手順は同じです。）

## 環境
* Gradle 3.0
* Mac OS X
* Java8

## build.gradleの作成

適当なディレクトリ（新しく作成するプロジェクトのホームディレクトリ）に ```build.gradle```　を作成します。
build.gradle はGradleでプロジェクトを管理しようと思ったら必須のビルドスクリプトファイルです。

```
$ vi build.gradle
```

```groovy:build.gradle
apply plugin: 'java'
```

はい、これだけです。
これだけあればGradleはこのディレクトリ以下にあるファイルたちがJavaアプリケーションであることを認識してくれます。

## ディレクトリの作成

Gradleは、プロジェクトがJavaアプリケーションであることを認識すると、ビルド時に所定のディレクトリをソースファイルやリソースファイルとしてクラスパスに追加します。

所定のディレクトリ、とは [45.4. Project layout](https://docs.gradle.org/current/userguide/java_plugin.html#sec:java_project_layout) に書いてある通りですので、この通りにディレクトリを作成します。

```
$ mkdir src{,/main{,/java,/resources},/test{,/java,/resources}}

$ tree
.
├── build.gradle
└── src
    ├── main
    │   ├── java
    │   └── resources
    └── test
        ├── java
        └── resources
```

※ sourceSet部分は、プロジェクトの事情によって追加する部分ですので省略しました。

```main``` にはプログラム本体を、 ```test``` にはテストコードを置きます。
また、 ```resources``` は入力データファイルや設定ファイルなどを置く場所です。

## 一旦ビルドしてみる

ここまで出来たら ```gradle build``` で一旦ビルドできるか確認してみます。

```
$ gradle build
Starting a Gradle Daemon, 1 stopped Daemon could not be reused, use --status for details
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jar
:assemble
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build

BUILD SUCCESSFUL

Total time: 6.158 secs
```

実際はgradleコマンドを実行する際のタスク（上記ではbuild）はかなり細分化されていて、細かい単位で指定することができますが、ひとまずはテストとコンパイル、JARの作成などの一連の作業をしてくれる ```build``` を使っておくと良さそうです。

ビルドが成功すると、以下のように build ディレクトリが生成され、中にソースコードを固めたJARファイルが作成されました。（まだ１クラスも書いていないので中身は空ですが。。。）

```
$ tree
.
├── build
│   ├── libs
│   │   └── gradle_test.jar
│   └── tmp
│       └── jar
│           └── MANIFEST.MF
├── build.gradle
└── src
    ├── main
    │   ├── java
    │   └── resources
    └── test
        ├── java
        └── resources

11 directories, 3 files
```

## まとめ

これで最小限のJavaプロジェクトが完成し、Javaプログラムを書き始める準備が整いました。
あとは、外部ライブラリが必要であれば build.gradle に ```dependencies``` を書いたり、Eclipseで開発したければEclipseプラグインを追加したり、細かいビルドのロジックが必要であれば自分でタスクを書いたりしていくことになります。

実際にはプロダクトによって様々なディレクトリが必要になるかもしれませんが、基本形はここに紹介した通りになります。

## おまけ：GradleWrapperを用意する

作成したプロジェクトをチームのメンバーと共有する場合は [GradleWrapper](https://docs.gradle.org/current/userguide/gradle_wrapper.html) を用意します。
GradleWrapperがあれば、チーム間で同じバージョンのGradleをインストールする等の環境構築が不要になります。

```
$ gradle wrapper
Starting a Gradle Daemon (subsequent builds will be faster)
:wrapper

BUILD SUCCESSFUL

Total time: 7.223 secs

$ ls -l
total 32
-rw-r--r--  1 chooyan_eng  wheel   355  9  6 01:26 build.gradle
drwxr-xr-x  3 chooyan_eng  wheel   102  9  6 08:51 gradle
-rwxr-xr-x  1 chooyan_eng  wheel  5242  9  6 08:51 gradlew
-rw-r--r--  1 chooyan_eng  wheel  2260  9  6 08:52 gradlew.bat
drwxr-xr-x  4 chooyan_eng  wheel   136  9  6 01:36 src
```

```gradlew``` は実行ファイルになっていますので、Gradleがインストールされていない環境でも、 ```gradlew``` コマンドによってgradleと全く同じことができる、というのが便利なポイントです。

> The gradlew command can be used exactly the same way as the gradle command.

ぜひ作成してソース管理に追加しましょう。