UbuntuにKotlinをインストールしてハローワールドまでやってみた #teratail_kt


`#teratail_kt`のたびにKotlinを触ってみているくらいなのでハローワールドから抜け出せてない今日この頃です。今回は3回目([Kotlin初心者向けハンズオン #3](https://kotlin.connpass.com/event/79344/))。

> 過去に試した記事
> - [CLIとVSCodeでKotlin開発を始めてみるメモ #teratail_kt](https://qiita.com/n0bisuke/items/4acb2d8be7a82d80a7c9)
> - [KotlinをNode.jsに変換してWebサーバーを作るメモ #teratail_kt](https://qiita.com/n0bisuke/items/6133180021386f206c14)

今日は利用しているUbuntu(16.04)にKotlinをインストールしてみます。

日本語導入っぽいのは現時点であんまりなので公式の[Working with the Command Line Compiler](https://kotlinlang.org/docs/tutorials/command-line.html)を参考にします。

## OSバージョン

```
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.2 LTS"
```

## SDKMANのインストール

SDKMANってはじめて知ったんですけどJavaユーザーのためのパッケージマネージャーらしいですね。

> [JavaユーザーのためのパッケージマネージャーSDKMAN
](https://qiita.com/ligun/items/6961918064dccbdac114)

JVM系言語の人たちには馴染みがある模様。

言語自体のバージョンの切り替えが出来ると思いきや、フレームワークなどのバージョン切り替えも出来る模様なので、Node.jsユーザー的にいうとnvmとnpmの両方の機能があるイメージでしょうか。(認識間違ってたら教えてください)

```
$ curl -s https://get.sdkman.io | bash

・
・
省略
・
・

Updated existing /home/n0bisuke/.zshrc



All done!


Please open a new terminal, or run the following in the existing one:

    source "/home/n0bisuke/.sdkman/bin/sdkman-init.sh"

Then issue the following command:

    sdk help

Enjoy!!!
```

とりあえずインストール完了です。

パスを通します。

```
$ source "/home/n0bisuke/.sdkman/bin/sdkman-init.sh"
```

`sdk help`が実行出来ればOKです。

```
$ sdk help
==== BROADCAST =================================================================
* 13/04/18: Gradle 4.7-rc-2 released on SDKMAN! #gradle
* 10/04/18: Springboot 1.5.12.RELEASE released on SDKMAN! #springboot
* 09/04/18: sbt 1.1.4 released on SDKMAN! #scala
================================================================================

Usage: sdk <command> [candidate] [version]
       sdk offline <enable|disable>

   commands:
       install   or i    <candidate> [version]
       uninstall or rm   <candidate> <version>
       list      or ls   [candidate]
       use       or u    <candidate> [version]
       default   or d    <candidate> [version]
       current   or c    [candidate]
       upgrade   or ug   [candidate]
       version   or v
       broadcast or b
       help      or h
       offline           [enable|disable]
       selfupdate        [force]
       update
       flush             <candidates|broadcast|archives|temp>

   candidate  :  the SDK to install: groovy, scala, grails, gradle, kotlin, etc.
                 use list command for comprehensive list of candidates
                 eg: $ sdk list

   version    :  where optional, defaults to latest stable if not provided
                 eg: $ sdk install groovy

```


### ちなみにzip入ってないって怒られました

```
Looking for zip...
Not found.
======================================================================================================
 Please install zip on your system using your favourite package manager.

 Restart after installing zip.
======================================================================================================
```

Ubuntuはapt-getで入れます。

```
$ sudo apt-get install zip
```

## SDKMAN経由でKotlinとJavaをインストール

Kotlinのインストールをします。

```
$ sdk install kotlin
```

javaのインストールをします。

```
$ sdk install java
```

それぞれバージョン確認

```
$ kotlin -version

Kotlin version 1.2.31-release-95 (JRE 1.8.0_163-b01)
```

```
$java -version

openjdk version "1.8.0_163"
OpenJDK Runtime Environment (Zulu 8.28.0.1-linux64) (build 1.8.0_163-b01)
OpenJDK 64-Bit Server VM (Zulu 8.28.0.1-linux64) (build 25.163-b01, mixed mode)
```

## ハローワールド

`hello.kt`を作成します。

```hello.kt
fun main(args: Array<String>) {
    println("Hello, World!")
}
```

```
$ ls
hello.kt
```

`kotlincコマンド`でコンパイルします。

```
$ kotlinc ./hello.kt -include-runtime -d hello.jar
```

Goとかの感覚からすると少し時間かかる印象です。 

`hello.jar`が作成されます。

```
$ ls
hello.jar  hello.kt
```

`kotlinコマンド`でjarファイルを実行します。(さっきのkotlincコマンドとkotlinコマンドは別なので注意)

```
$ kotlin hello.jar
Hello, World!
```

お疲れ様でした。

## 感想など

特に問題なくできた印象。SDKMANの存在を知れたのが収穫かも。

kotlincコマンドのコンパイル時間が気になるのでプログレス表示とか出来る方法があると嬉しいなと思った。 (IDEは使わずにCLIの話)