joobyのEclipse開発環境をGradleで動作させる

[joobyの開発環境をEclipseで構築する](http://qiita.com/kitaji0306/items/a8deddb194f845a4fbd6)
の関連となりますが、Gradleでビルド出来るようにしたいと思います。

# 前提条件
- 開発環境はWindows
- WindowsにはJava8がインストール済み
- EclipseがJava8で動作設定済み
- EclipseにGradleが導入済み

# Gradleを利用したビルド環境の構築
## joobyのプロジェクトディレクトリの作成
[こちら](http://qiita.com/kitaji0306/items/a8deddb194f845a4fbd6#maven%E3%81%A7%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AE%E4%BD%9C%E6%88%90%E3%81%93%E3%81%93%E3%81%BE%E3%81%A7%E3%81%A7%E3%82%B5%E3%83%BC%E3%83%90%E5%86%85%E3%81%A7%E3%81%AE%E4%BD%9C%E6%A5%AD%E3%81%AF%E7%B5%82%E4%BA%86)を参考に、プロジェクトディレクトリを作成します。（mavenのarchetypeまで実施）

## gradleの導入
※環境構築に利用するため（実際にはWindowsのEclipseプラグインでGradleは動作させるため）、PATHの設定等は割愛します。

```
[vagrant@localhost ~]$ sudo mkdir /opt/gradle
[vagrant@localhost ~]$ sudo wget https://services.gradle.org/distributions/gradle-3.5.1-bin.zip -O /opt/gradle/gradle-3.5.1-bin.zip
--2017-07-18 09:21:40--  https://services.gradle.org/distributions/gradle-3.5.1-bin.zip
Resolving services.gradle.org (services.gradle.org)... 104.16.174.166, 104.16.175.166, 104.16.171.166, ...
Connecting to services.gradle.org (services.gradle.org)|104.16.174.166|:443... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://downloads.gradle.org/distributions/gradle-3.5.1-bin.zip [following]
--2017-07-18 09:21:40--  https://downloads.gradle.org/distributions/gradle-3.5.1-bin.zip
Resolving downloads.gradle.org (downloads.gradle.org)... 104.16.171.166, 104.16.172.166, 104.16.173.166, ...
Connecting to downloads.gradle.org (downloads.gradle.org)|104.16.171.166|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 73302707 (70M) [application/zip]
Saving to: ‘/opt/gradle/gradle-3.5.1-bin.zip’

100%[====================================================================================>] 73,302,707  19.4MB/s   in 4.1s

2017-07-18 09:21:44 (17.2 MB/s) - ‘/opt/gradle/gradle-3.5.1-bin.zip’ saved [73302707/73302707]

[vagrant@localhost ~]$ sudo unzip -d /opt/gradle/ /opt/gradle/gradle-3.5.1-bin.zip
Archive:  /opt/gradle/gradle-3.5.1-bin.zip
   creating: /opt/gradle/gradle-3.5.1/
  inflating: /opt/gradle/gradle-3.5.1/LICENSE

～～～

```

## mavenプロジェクトからgradleプロジェクトの作成

```
[vagrant@localhost ~]$ cd /vagrant/my-app/
[vagrant@localhost my-app]$ /opt/gradle/gradle-3.5.1/bin/gradle init --type pom
Starting a Gradle Daemon (subsequent builds will be faster)
:wrapper
:init
Maven to Gradle conversion is an incubating feature.

BUILD SUCCESSFUL

Total time: 7.44 secs
```

## Eclipseインポート用のプロジェクトに変換（ここまででサーバ側の作業は終了です）
### build.gradle に **apply plugin: 'eclipse'** を追記

```build.gradle
[vagrant@localhost my-app]$ cat build.gradle
apply plugin: 'java'
apply plugin: 'maven'
apply plugin: 'eclipse'

group = 'com.mycompany'
version = '1.0-SNAPSHOT'

description = """my-app"""

sourceCompatibility = 1.8
targetCompatibility = 1.8
tasks.withType(JavaCompile) {
        options.encoding = 'UTF-8'
}

configurations.all {
}

repositories {

     maven { url "http://repo.maven.apache.org/maven2" }
}
dependencies {
    compile group: 'org.jooby', name: 'jooby-netty', version:'1.1.3'
    compile group: 'ch.qos.logback', name: 'logback-classic', version:'1.1.7'
    testCompile group: 'junit', name: 'junit', version:'4.12'
    testCompile group: 'io.rest-assured', name: 'rest-assured', version:'3.0.1'
```

### 変換タスクの実行

```
[vagrant@localhost my-app]$ /opt/gradle/gradle-3.5.1/bin/gradle eclipse
:eclipseClasspath
:eclipseJdt
:eclipseProject
:eclipse

BUILD SUCCESSFUL

Total time: 1.68 secs
```

## EclipseからGradleプロジェクトのインポート
### プロジェクトのルートディレクトリを指定して取込
![クリップボード01.jpg](https://qiita-image-store.s3.amazonaws.com/0/70168/928bc753-35b7-dff7-3846-1b1f757c86f3.jpeg)
※次へと完了を押して行ってください

### jooby用の設定を追記
joobyの公式サイトを参考に、必要な設定を追記します。

- buildscriptブロック
- apply plugin: 'jooby'
- joobyRunタスクのmainClassName

※変更後にはGradleタスクをF5リフレッシュします。（リフレッシュしないと、追記した設定が反映されませんでしたので）
ついでに、もう不要となったplugin（maven、eclise）は削除しておきます。

```
buildscript {

  repositories {
    mavenCentral()
  }

  dependencies {
    /** joobyRun */
    classpath group: 'org.jooby', name: 'jooby-gradle-plugin', version: '1.1.3'
  }
}

apply plugin: 'java'
apply plugin: 'jooby'

group = 'com.mycompany'
version = '1.0-SNAPSHOT'

description = """my-app"""

sourceCompatibility = 1.8
targetCompatibility = 1.8
tasks.withType(JavaCompile) {
	options.encoding = 'UTF-8'
}

configurations.all {
}

repositories {

     maven { url "http://repo.maven.apache.org/maven2" }
}
dependencies {
    compile group: 'org.jooby', name: 'jooby-netty', version:'1.1.3'
    compile group: 'ch.qos.logback', name: 'logback-classic', version:'1.1.7'
    testCompile group: 'junit', name: 'junit', version:'4.12'
    testCompile group: 'io.rest-assured', name: 'rest-assured', version:'3.0.1'
}

joobyRun {
  mainClassName = 'com.mycompany.App'
}
```

### **joobyRun** タスクの実行
![クリップボード02.jpg](https://qiita-image-store.s3.amazonaws.com/0/70168/99b6a035-4784-fff6-6c61-a0ff00cc5df7.jpeg)

```
[2017-07-18 09:50:08,097]-[HotSwap] INFO  com.mycompany.App - [dev@netty]: Server started in 1292ms

  GET /    [*/*]     [*/*]    (/anonymous)

listening on:
  http://localhost:8080/

```

## 動作確認してみた
### ブラウザで **http://localhost:8080/** にアクセス

```
Hello World!
```
正常に動作しているようです。

### App.javaを修正してHot Reloadされることを確認
リロードされませんでした。
よく見るとコンソールに下記のような表示がありました。

```
>>> jooby:run[info|Daemon worker]: Hotswap available on: [C:\work\tmp\pleiades\eclipse]
```

どうやら、Eclipse本体のインストールパスがベースディレクトリになってしまっているようです。
ソースを調査してみたところ、**user.dir** というシステム変数で基準ディレクトリを設定できるようでした。
そのため、joobyRunタスクで上記変数を定義しておきます。（gradleのrootプロジェクトのパスが無難かと）

```build.gradle
～～～

joobyRun {
  mainClassName = 'com.mycompany.App'
  System.setProperty("user.dir", rootDir.path)
}
```

### 再度jobbyRunタスク再起動後にブラウザで **http://localhost:8080/** にアクセス
```
Hello World!
```

### App.javaを修正してHot Reloadされることを確認
自動でリロードされているようです。

```
[2017-07-18 12:13:26,477]-[HotswapScanner] INFO  com.mycompany.App - Stopped

～～～

[2017-07-18 12:13:27,693]-[HotSwap] INFO  com.mycompany.App - [dev@netty]: Server started in 1102ms

  GET /    [*/*]     [*/*]    (/anonymous)

listening on:
  http://localhost:8080/
```


### ブラウザで **http://localhost:8080/** にアクセス

```
Hello World!
```

あれ？リロードされたけど、修正結果が反映されていない。

### コンパイルされたclassファイル等の配置ディレクトリの変更
下記のように、それぞれで見ているclassファイルが違うためにリロードは検知するが、実際のリロード結果は反映されていないといった
情況になっていたようです。

- Eclipseのデフォルトコンパイル先ディレクトリ：my-app/bin
- Gradleが通常利用するコンパイル先ディレクトリ：build/classes/main
- 今回は関係ないですがmavenの通常利用するディレクトリ：target/classes

一旦手動で、下記のようにEclipseのコンパイル先ディレクトリを個別に指定してみる。
![クリップボード03.jpg](https://qiita-image-store.s3.amazonaws.com/0/70168/b648d676-85c0-5be6-936e-e2fb76d2f1f7.jpeg)


### 再度jobbyRunタスク再起動後にブラウザで **http://localhost:8080/** にアクセス
```
Hello World!
```

### ソースを修正して再度アクセス

```
Hello World!!!!!!!!!!!!!!!!!!!
```

反映されました。
これで、gradleで開発環境を動作させて開発作業を進められそうです。


## 最後に
手動でEclipseのクラスパス設定を変更してしまっているので、ベストな方法とは思えないのですが初回だけの作業ならまだ許容範囲でしょうか。
（もしかしたらEclipseプラグインでgradleプロジェクト作成時にうまく設定できるかもしれません）