[Grails]Grails3.0でHelloWorld

SDKMANでさくっとインストール
[SDKMAN](http://sdkman.io/)
簡単なSDKMANの使い方はコチラにも有ります。
[[Groovy]gvmが生まれ変わった。SDKMANでGrvoovyやGrailsをインストール](http://qiita.com/saba1024/items/967ee3d8a79440a97336)

また、Grailsのチュートリアルも公開中ですのでそちらも合わせてご覧くだし。
[Grailsチュートリアル](http://koji-k.github.io/grails-tutorial/)

#Grailsアプリケーションの作成
適当なディレクトリで、今までと同じく`create-app`コマンドを実行します。

```console
kkuwana% grails create-app hellograils3
| Application created at /home/k-kuwana/IdeaProjects/hellograils3
kkuwana% 
```

コレでアプリケーションが作成されました。
とりあえずアプリケーションのトップディレクトリに移動して中身を覗いてみます。


```console
kkuwana% pwd
/home/k-kuwana/IdeaProjects/hellograils3
kkuwana% ls -alh
合計 40K
drwxr-xr-x  5 k-kuwana k-kuwana 4.0K  3月 31 16:45 .
drwxr-xr-x 28 k-kuwana k-kuwana 4.0K  3月 31 16:45 ..
-rw-r--r--  1 k-kuwana k-kuwana 2.0K  3月 31 16:45 build.gradle
drwxr-xr-x  3 k-kuwana k-kuwana 4.0K  3月 31 16:45 gradle
-rw-r--r--  1 k-kuwana k-kuwana   45  3月 31 16:45 gradle.properties
-rwxr--r--  1 k-kuwana k-kuwana 5.0K  3月 31 16:45 gradlew
-rw-r--r--  1 k-kuwana k-kuwana 2.4K  3月 31 16:45 gradlew.bat
drwxr-xr-x 12 k-kuwana k-kuwana 4.0K  3月 31 16:45 grails-app
drwxr-xr-x  5 k-kuwana k-kuwana 4.0K  3月 31 16:45 src
kkuwana% 
```
噂通りGradleが！

#コントローラの作成
では早速コントローラを作っていきます。
先ほど作成したディレクトリに移動して、`grails`コマンドを実行します。
初回は山ほどライブラリをダウンロードしてくるので気長に待ちます。

コントローラの作成方法も以前のバージョン同様の`create-controller`で行います。

```
grails> create-controller helloworld
| Created grails-app/controllers/hellograils3/HelloworldController.groovy
| Created src/test/groovy/hellograils3/HelloworldControllerSpec.groovy
grails> 
```

では早速`HelloWorldController.groovy`を編集します。
とりあえずはvimで。

``` 
vi IdeaProjects/hellograils3/grails-app/controllers/hellograils3/HelloworldController.groovy 
```

```groovy:grails-app/controllers/hellograils3/HelloworldController.groovy
package hellograils3

class HelloworldController {

    def index() {
        render "こんにちわ世界"
    }
}
```

上記のようなコードを書いたら、早速Grailsの起動です。

Grailsのインタラクティブモードの状態で、`run-app`を実行します。

```
grails> run-app
:compileJava UP-TO-DATE
:compileGroovy
:processResources
:classes
:findMainClass
:bootRun
Grails application running at http://localhost:8080
> Building 83% > :bootRun
```
メッセージからGradleに匂いがしますね！
この状態でhttp://localhost:8080にアクセスすれば、Grailsが起動していることが確認できます。

![範囲を選択_001.png](https://qiita-image-store.s3.amazonaws.com/0/11059/2a8bac0d-05d0-a34c-78f2-3ef74c60b06b.png)

それでは早速HelloWorldにアクセスしましょう！
URLは[http://localhost:8080/helloworld](http://localhost:8080/helloworld)です。

![範囲を選択_004.png](https://qiita-image-store.s3.amazonaws.com/0/11059/78aa5be3-3109-df41-fb5f-5ca5262856f0.png)

問題ありませんね！

#viewの作成
ではview（gsp）も作成してみます。
コントローラを作成すると、そのコントローラ用のviewの**ディレクトリ**が作成されます。
今回の場合、`/home/k-kuwana/IdeaProjects/hellograils3/grails-app/views/helloworld`というディレクトリが作成されいます。
このディレクトリ配下に`index.gsp`を作成します。

```jsp:grails-app/views/helloworld/index.gsp
<html>
<head>
<title>This is GSP!</title>
</head>
<body>
    <h1>Hello World on GSP!</h1>
    <g:each in="${(1..5)}" var="i">
        <p>GSP! ${i}</p>
    </g:each>
</body>
</html>
```

コントローラは表示処理をviewに任せるので、renderをコメントアウトするか削除しましょう。

```groovy:grails-app/controllers/hellograils3/HelloworldController.groovy
package hellograils3

class HelloworldController {

    def index() {
        //render "こんにちわ世界"
    }   
}

```

それでは再度[HelloWorld]((http://localhost:8080/helloworld))にアクセスしてみましょう。

![範囲を選択_005.png](https://qiita-image-store.s3.amazonaws.com/0/11059/36575301-64b1-da44-4a4e-209d2bf763b4.png)


大丈夫ですね。

#IDE（IntelliJ）を使う

Grails3.0からGradleベースになっているのでインポートもお手軽になっているそうです。
ということでIntelliJにインポートしてみます。

単純にメニューから`Import Project`を選択して、作成したGrailsアプリケーションの`build.gradle`を選択するだけです。

![範囲を選択_006.png](https://qiita-image-store.s3.amazonaws.com/0/11059/53c0c0cb-a39c-e474-a02a-696e3b0956db.png)

![範囲を選択_007.png](https://qiita-image-store.s3.amazonaws.com/0/11059/7118843e-c082-c683-259f-09554539e154.png)

![範囲を選択_008.png](https://qiita-image-store.s3.amazonaws.com/0/11059/25213ea7-c62a-43c7-78ce-23c1b987afc8.png)

コレだけでOK!

#現状の問題点
多分自分の環境が原因だと思うけど、run-appを実行すると、gradleがコンソールへの出力を中途半端なところで止めてしまってコマンドが入力できない。

```
grails> run-app
:compileJava UP-TO-DATE
:compileGroovy UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:findMainClass
:bootRun
Grails application running at http://localhost:8080
> Building 83% > :bootRun
```

上記の用に`> Building 83% > :bootRun`で出力が止まってしまって、grailsの他のコマンドが実行できない。
Grailsアプリケーションを停止するにはctrl-cを使うしか無い。

##追記
コメントで教えていただきました。現状はこれが仕様のようです。
別途コンソールを立ち上げてそこでGrailsのインタラクティブモードに入ってしまえばそちらで`create-controller`などのコマンドが実行できます。

#その他気づいた点

##BootStrap
IntelliJを使う場合、GrailsViewだとBootstrapが見えません。
Projectビューにすると、`grails-app/init`の下にBootStrapがあります。

##本番環境で再起動なしにGSPの編集を反映させる？
なんだかできるっぽい。
[7.2.7 Making Changes to a Deployed Application](http://grails.github.io/grails-doc/latest/guide/theWebLayer.html#7.2.7 Making Changes to a Deployed Application)
要調査。

#その他起動方法
IntelliJを使っている場合、IntelliJから簡単にGrailsを起動させることができます。
`grails-app/init/コントローラ名/Application.groovy`を右クリックして、`Run 'Application.main()'`を実行するだけです。

![スクリーンショット 2015-04-01 0.26.33.png](https://qiita-image-store.s3.amazonaws.com/0/11059/ead5b17e-b41b-e32e-04d1-9a9430df4fa9.png)

ただし、標準だとGrailsのauto-reload機能が無効になってしまっています。
これを有効にするために、
メニューの**run** ---> **Edit Configurations...**から、ApplicationのVM Optionに、`"-Xverify:none"`を指定してあげます。

![スクリーンショット 2015-04-01 0.31.13.png](https://qiita-image-store.s3.amazonaws.com/0/11059/553a23db-f999-714c-fc4e-6b5d452197e0.png)

これでIntelliJから`Run 'Application.main()'`を実行してGrailsアプリケーションをauto-reloadが有効な状態で起動することができるようになりました。

ただし、`run-app`コマンドでGrailsを起動した場合とは少し異なる状態のようです。

**run-appで起動した場合**
![スクリーンショット 2015-04-01 0.35.08.png](https://qiita-image-store.s3.amazonaws.com/0/11059/9b5d4189-a65a-7f09-bbda-5de5882862ab.png)

**IntelliJから起動した場合**
![スクリーンショット 2015-04-01 0.34.39.png](https://qiita-image-store.s3.amazonaws.com/0/11059/3706f729-343c-3dac-db79-abc1963cf4ce.png)

**App version**と**Grails version**が、IntelliJから起動した場合には省略されていて、特に気なるのが**App profile**という値が異なっている点です。

具体的に何が違うのかは今後要調査。

#参考
[http://d.hatena.ne.jp/mottsnite/20150331/1427797579](http://d.hatena.ne.jp/mottsnite/20150331/1427797579)
[https://www.youtube.com/watch?v=aro3_RZqgtU](https://www.youtube.com/watch?v=aro3_RZqgtU)