[ことクロ６]　コマンドラインでKotlin勉強 on Spring Boot

# 0)序
"Kotlinでスマートフォン・クロスプラットフォーム開発入門"、勝手に略して、"ことクロ"シリーズ　その6。
今回は、コマンドラインでKotlinを適切に実行する環境を、先人の知恵を借り、Spring Boot込みで、実行時間数分で構築する。
*(前提として、gitとJava(8)はインストール済とする。)*

そもそも、[kotlinはブラウザで即実行可能](http://try.kotlinlang.org/)なので、あえてローカル環境を構築するならば、勉強になる付加機能がも欲しいところ。

# 1) *(参考)* 正統派のやり方
## 1-1 Groovyベースのビルドツールgradleを導入する

homebrewが入っているMac OSでは :

```bash
$ brew install gradle
```
chocolateyが入っているWindowsでは:

```bash
$ cinst gradle
```
## 1-2 Gradleで、java環境を初期化

gradle initコマンドを実行。
*(typeオプションが定義されている言語、例えば、scalaでは、同様に--type scala-libraryで環境を導入できる。)*

```bash
$ gradle init --type java-library
:wrapper
:init
BUILD SUCCESSFUL

Total time: 5.977 secs
```

フォルダ構成を確認。

```groovy

$ tree
.
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── src
    ├── main
    │   └── java
    │       └── Library.java
    └── test
        └── java
            └── LibraryTest.java

```
## 1-3 build.gradleを編集
Kotlinでは、gradle initコマンドのtypeオプションが定義されていないので、

ファイルbuild.gradleを編集し、、GradleにKotlin環境を用意してもらう。
例えば、[ここの解説](http://zweifisch.github.io/kotlin-with-gradle.html)を参考に、現在のKotlinバージョンの導入を試していただきたい
...導入がうまくいったならば、以下のように、kotlinファイルを作成...*(以下、略)*

```bash
$ mkdir -p src/main/kotlin
$ touch src/main/kotlin/Main.kt
```

...正攻法は、直近の目的のためにKotlinを使う的にじっくり時間をかけて行うこととしよう。

#2) (速攻) Kotlinのコマンドライン実行環境を導入。
## 2-1 背景
- Kotlinは、まだバージョン1.0に達していない。コンパイラ本体のみならず、周辺ライブラリ等も変化していく。そのため、build.gradleは結構頻繁に書き換える必要がある。
- 優等生なビルドツールGradleには、配布のための仕組みgradlewが完備。これにより、githubにちゃんとリリースされたgradlew付きリリースは素早く実行環境を構築できる。*=>gradleとgradlewの関係が気になる人は、[Gradle入門](http://qiita.com/vvakame/items/83366fbfa47562fafbf4)でtask wrapperを調べると良い。*
- Gradleを活用した今風webフレームワークにJava製のSpringBootがある。SpringBootはMain関数で実行する形式。Javaと相性の良いKotlinならば...

## 2-2 Spring Bootと共に導入
幸い、Kotlinの開発元Jetbrains社が[Creating a RESTful Web Service with Spring Boot](https://kotlinlang.org/docs/tutorials/spring-boot-restful.html)という素敵なチュートリアルを用意してくれていて・・・、チュートリアルを再現しようと思ったが、今晩はさらに運が良かった。　学生さんが、[素敵なプレゼン](http://www.slideshare.net/junpeimatsuda56/spring-gradle-kotlin-w8lt5)と共に、今時点のKotlin環境のbuild.gradleを公開してくれている。
https://github.com/jmatsu/SpringBootWithKotlinSample

学生さんの肩に乗らせてもらうと、以下で、webフレームワークSpringBoot付きのKotlin環境が導入できる。
(windows環境の場合)
> git clone https://github.com/jmatsu/SpringBootWithKotlinSample
> cd SpringBootWithKotlinSample
>.\gradlew.bat build

（=> Mac等では``` $ ./gradlew build```などと適宜置き換え。）

そして、
> java -jar build\libs\spring-boot-w-kotlin.jar

と実行して、ブラウザから、
http://localhost:8080/hello
とアクセスすると、ビルドされたデプロイ可能なスタンドアロンjarとしてSpringBootが実行されている。
その後は、[SpringBootとGradleでHelloWorld](http://qiita.com/toruuetani/items/290d22a42c33c73831da)あたりを参考に、SpringBootをkotlinコードでいじってみてほしい。

## 2-3) コマンドラインでKotlinを楽しむ
なぜ、これで環境導入が終わりなのか。その理由は、Application.ktの[元ソース](https://github.com/jmatsu/SpringBootWithKotlinSample/blob/master/src/main/kotlin/sample/Application.kt)の
> SpringApplication.run(Application::class.java, *args)

という、SpringBootブート部分を例えば、pringln文に置き換えてみると分かる。

```Applivation.kt
package sample

import org.springframework.boot.SpringApplication
import org.springframework.boot.autoconfigure.EnableAutoConfiguration
import org.springframework.context.annotation.ComponentScan

@ComponentScan
@EnableAutoConfiguration
public class Application {
    companion object {
        @JvmStatic
        fun main(args: Array<String>): Unit {
            println("コマンドラインのみっ!")
        }
    }
}
```
gradlew runしてみると、

```dos
$ .\gradlew.bat run
:compileKotlin
:compileJava
:processResources UP-TO-DATE
:classes
:findMainClass
:run
コマンドラインのみっ!

BUILD SUCCESSFUL

Total time: 10.257 secs
```
SpringBootのおまじないが少し気になるが、Kotlinの記述をコマンドラインで試すことができることが分かる。
もちろん、springbootのフル機能をコマンドライン上で試せるので、一石二鳥の学習環境と考えよう(手抜きだけど)。