Gradle 覚書

Gradle を手っ取り早く使うための手順

少し使えるようになったら、以下を読むとぐっと理解が深まります（groovy知らない人は特に）

[Groovyを知らない人のためのbuild.gradle読み書き入門](https://qiita.com/opengl-8080/items/a0bb31fb20cb6505188b)

# インストール
https://gradle.org/install/#manually からバイナリをダウンロードして展開、bin ディレクトリにパスを通して終わり

```
export GRADLE_HOME=・・・
export PATH="${GRADLE_HOME}/bin:${PATH}"
```

# ディレクトリ構成
以下の通りディレクトリを作る。Maven のプラグイン開発に則ってるみたいだけど、深く考えない。トップディレクトリが jar の名前になる

```
[トップディレクトリ]
  +-- build.gradle
  +-- src/
      +-- main/
          +-- groovy/
          +-- java/
          +-- resources/
      +-- test/
          + main 配下と同じなので略
```

main 配下の役割は以下の通り

- build.gradle: make の Makefile。ant の build.xml に相当するファイル
- groovy: groovy ファイルを入れる
- java: Java のソースコード
- resources: property、画像(アイコン)などを入れる。gradle で run するときの classpath として自動的にはいる。この中のディレクトリファイルは本体の jar にも含まれるので、含めたくないものはここに置かないようにする

# コンパイル
main/src/java に適当なコードをつっこんで、build.gradle ファイルを以下一行を記載

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

gradle build を実行

トップディレクトリ配下に build ディレクトリが作成され、色々ファイルができてる。すごい。この時点で ant との決別を決意

```
build
|-- classes
|   `-- java
|       `-- main
|           `-- Test.class
|-- distributions
|   |-- sandbox.tar
|   `-- sandbox.zip
|-- libs
|   `-- sandbox.jar
|-- scripts
|   |-- sandbox
|   `-- sandbox.bat
`-- tmp
    |-- compileJava
    `-- jar
        `-- MANIFEST.MF
```

# クラスパスの追加

```
dependencies {
  compile fileTree(dir: 'libs', include: '*.jar')
  runtime files('src/main/dist/lib/properties')
}
```

- compile に指定したものは、一律配布物の lib ディレクトリに含めてくれる
- runtime は含めない(含めたい場合は以下)

# 実行
build.gradle に以下二行を追加し、gradle run を実行するだけ

```
apply plugin: 'application'
mainClassName = '実行したいクラス名'
```

~~プロパティファイルなど、classpath 探索するものがあれば、resources ディレクトリに入れておく~~
配布物に影響があるので、dependencies を使って適宜設定
ただ動かすだけなら resources に突っ込んでおけば OK

実行時の classpath の追加は以下を build.gradle に追加(以下はディレクトリを追加した例)。ここは普通に filetree など、ご自由に

```
dependencies {
   runtime files('src/main/dist/lib/properties')
}
```

# 配布物
build/distributions/ 配下にある tar(zip) ファイルが必要なものがjar,起動シェルなど一式が入ったファイル。これを展開すればよい

Java のソースコードだけであれば、内容は以下の通り

```
# tar tvf build/distributions/sandbox.tar
drwxr-xr-x 0/0               0 2017-10-14 09:54 sandbox/
drwxr-xr-x 0/0               0 2017-10-14 09:54 sandbox/lib/
-rw-r--r-- 0/0             885 2017-10-14 09:54 sandbox/lib/sandbox.jar
drwxr-xr-x 0/0               0 2017-10-14 09:54 sandbox/bin/
-rwxr-xr-x 0/0            5210 2017-10-14 09:54 sandbox/bin/sandbox
-rwxr-xr-x 0/0            2180 2017-10-14 09:54 sandbox/bin/sandbox.bat
```

この配布物に property ファイルを追加する場合の手順
結論は、配布物に以下構成で property ファイルを追加

```
+-- sandbox
    +-- lib/properties/~~.properties <-- 追加
    +-- bin/

```

lib ディレクトリ配下ってのが、うーんという感じだが、build.gradle をあまりいじらないでやるにはこれがいいっぽい

やりかた
property ファイルは以下の通り配置する

```
[トップディレクトリ]
  +-- build.gradle
  +-- src/
      +-- main/
          +-- dist/
              +-- lib/
                  +-- properties/
                      + ~~.properties
```

build.gradle に以下追加

``` build.gradle
startScripts {
    classpath += files('dist/lib/properties')
}
```

よくわからないけど、`files('dist/properties')` でもできる。
dist 配下は、dist/lib/～～～ にしないとダメ。lib ディレクトリぬかすと、配布物の直下ディレクトリに properties ディレクトリができちゃう

gradle build すれば、最初に書いた通り、lib/properties ディレクトリに含めてくれ且つ、起動 script の CLASSPATH にも追加してくれる

この起動 script への CLASSPATH の追加がネックで。$APP_HOME/lib/~~ になってしまうので、この構成にするしかない、、、

以前は dist と resources でシンボリックリンク案も書いたが、resources ディレクトリの物は本体の jar ファイルの中に含まれてしまうので、property を外出ししたい場合は NG
ただし、運用中にいじらない property なら resources ディレクトリに突っ込んで OK