AndroidStudio付属のKotlin実行環境でコマンドライン実行してみた

# はじめに

[AndroidStudioのインストールは完了してKotlinでプログラミングする環境は用意できた](https://qiita.com/zaki-lknr/items/cdd3c2c82af1f1c0690b)けど、ちょっとしたコードをAndroidエミュレータや実機にデプロイして実行するのがちょっと大げさすぎるので、もうちょっと簡単にコマンドラインで実行できないか確認してみた。

# Kotlinのコンパイラ

AndroidStudio(version 3.3.2の場合)をインストールしたディレクトリの`$ANDROIDSTUDIO_HOME/plugins/Kotlin/kotlinc/bin`にある。
このディレクトリを環境変数PATHに加えればOK。

```
PS C:\Program Files\Android\Android Studio\plugins\Kotlin\kotlinc\bin> ls


    ディレクトリ: C:\Program Files\Android\Android Studio\plugins\Kotlin\kotlinc\bin


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2019/02/16     16:49            786 kapt
-a----       2019/02/16     16:49            789 kapt.bat
-a----       2019/02/16     16:49            691 kotlin
-a----       2019/02/16     16:49            731 kotlin-dce-js
-a----       2019/02/16     16:49            736 kotlin-dce-js.bat
-a----       2019/02/16     16:49            696 kotlin.bat
-a----       2019/02/16     16:49           2280 kotlinc
-a----       2019/02/16     16:49            732 kotlinc-js
-a----       2019/02/16     16:49            737 kotlinc-js.bat
-a----       2019/02/16     16:49            667 kotlinc-jvm
-a----       2019/02/16     16:49            662 kotlinc-jvm.bat
-a----       2019/02/16     16:49           1899 kotlinc.bat
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256859/8aa384b4-e1ad-cbea-1c19-56cc1945c112.png)

こんな感じ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256859/8051ba25-46c9-47f8-dffb-ab18219cdeec.png)

確認

```
PS C:\Users\zaki\src\kotlin> kotlinc -version
info: kotlinc-jvm 1.3.21 (JRE 1.8.0_201-b09)
```


# サンプルコードと実行

## mainがない誤り

```kotlin:hello.kt(誤)
fun hello() {
    print("hello kotlin!")
}
```

```
PS C:\Users\zaki\src\kotlin> kotlinc hello.kt
PS C:\Users\zaki\src\kotlin> kotlin HelloKt
error: 'main' method not found in class HelloKt
PS C:\Users\zaki\src\kotlin>
```

あ、そこは`main()`関数を作らないとダメなのね。

## mainを実装

```kotlin:hello.kt
fun main() {
    print("hello kotlin!")
}
```

```
PS C:\Users\zaki\src\kotlin> kotlinc hello.kt
PS C:\Users\zaki\src\kotlin> kotlin HelloKt
Hello Kotlin!
PS C:\Users\zaki\src\kotlin>
```

動いた。

(5/11 コメント欄の指摘から追記)
~~ただ、正しくは、引数の文字列配列の`args`まで指定する。~~
Kotlin 1.3以降は`main()`の引数は省略可能になっている。
[What's New in Kotlin 1.3 - Kotlin Programming Language](https://kotlinlang.org/docs/reference/whatsnew13.html#parameterless-main)

引数の処理を行いたい場合は

```kotlin:hello.kt
fun main(args : Array<String>) {
    print("Hello " + args[0] + "!!!")
}
```

引数を渡して実行

```
PS C:\Users\zaki\src\kotlin> kotlinc hello.kt
PS C:\Users\zaki\src\kotlin> kotlin HelloKt kurerin
Hello kurerin!!!
PS C:\Users\zaki\src\kotlin>
```

※ 参考(下記は2017年の記事)
[第1回　Kotlinを勧める理由：プログラマに優しい現実指向JVM言語 Kotlin入門｜gihyo.jp … 技術評論社](http://gihyo.jp/dev/serial/01/jvm-kotlin/0001)

## 作成されるファイル

```
PS C:\Users\zaki\src\kotlin> ls -Recurse


    ディレクトリ: C:\Users\zaki\src\kotlin


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2019/05/09      7:46                META-INF
-a----       2019/05/09      7:33             63 hello.kt
-a----       2019/05/09      7:46            960 HelloKt.class


    ディレクトリ: C:\Users\zaki\src\kotlin\META-INF


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2019/05/09      7:46             29 main.kotlin_module


PS C:\Users\zaki\src\kotlin>
```

作成されるクラスファイルはソースファイル名ベースだけど、先頭大文字になるので`kotlin helloKt`だと動かないので注意。

## jarファイルの作成と実行

```
PS C:\Users\zaki\src\kotlin> kotlinc hello.kt -include-runtime -d hello.jar
PS C:\Users\zaki\src\kotlin> ls


    ディレクトリ: C:\Users\zaki\src\kotlin


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2019/05/09      7:46                META-INF
-a----       2019/05/09      7:52        1169318 hello.jar
-a----       2019/05/09      7:33             63 hello.kt
-a----       2019/05/09      7:46            960 HelloKt.class


PS C:\Users\zaki\src\kotlin>
```

生成されたjarファイルは、普通のJREで動作する。
(Kotlin環境のない`java`で動作する)


例えばUbuntuのOpenJDKで。

```
zaki@cheddar% uname -a
Linux cheddar 4.15.0-47-generic #50-Ubuntu SMP Wed Mar 13 10:44:52 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
zaki@cheddar% java -version
openjdk version "10.0.2" 2018-07-17
OpenJDK Runtime Environment (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4)
OpenJDK 64-Bit Server VM (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4, mixed mode)
zaki@cheddar% java -jar hello.jar
Hello Kotlin!%
zaki@cheddar% 
```

※ WindowsのPSターミナルだと気づかなかったけど、`println()`でなく`print()`を使ってるので末尾に改行がない。

# AndroidStudio上で`main()`の実行

(5/11 コメント欄の指摘から追記)

実はAndroidアプリのプロジェクトでも、`main()`を実装すればCLI実行できる。
任意のディレクトリ(パッケージ)で「Kotlin File/Class」を作成。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256859/9bf6c724-5815-cf94-854e-1d8f2a426a85.png)

ファイル名は適当に。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256859/c303f53e-97b6-8819-9d38-ddbf6f315df1.png)

できたファイルに`main()`を実装する

```kotlin:sample.kt
package com.example.kotlinblankapp

fun main() {
    println("Hello Kotlin on AndroidStudio!")
}
```

すると、`main()`の横に▶アイコンが表示されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256859/37c0f235-1a2c-dc5d-5c41-b8716ce24571.png)

"Run"を実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256859/2c1ba28a-97a4-ef71-b96b-16a4c82baa1e.png)

すると、AndroidStudio下部の"Run"ウインドウに、実行結果が表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256859/67e8cdce-863e-27a7-6701-bf22242a7cc4.png)


# (おまけ)オンライン実行

コマンドライン実行でなく、「実機でデプロイするのが面倒」を解決したいだけであれば、オンラインでコードを書くという手段も。

- 公式
    - [Kotlin Playground: Edit, Run, Share Kotlin Code Online](https://play.kotlinlang.org/)

- paizaさん
    - [Kotlin Online - Online Kotlin Compiler - Online Kotlin Editor - Run Kotlin Editor - Online Kotlin Runner](https://paiza.io/ja/languages/kotlin)

---

- 参考
    - [Kotlin CLI の使い方: kotlin, kotlinc, kotlinc-js, kotlin-dce-js - Qiita](https://qiita.com/KenjiOtsuka/items/f39318890415d071404c)
    - [Kotlin でコマンドラインの Hello World アプリケーション - Qiita](https://qiita.com/niwasawa/items/6b0c5ae8d37d12e5a40d)