Kotlin を CentOS でコンパイル
〜 コマンドライン版のインストールは 2 種類 〜
2018-10-19 作成 福島
TOP > tips > kotlin-linux-cli
0. インストール要件
種類内容備考
OSCentOS 7.5 (1804)本稿記述時の最新版
実行系java 1.8.0_181 (JVM)CentOS に付属
Kotlin でコンパイルした jar を実行します
言語Kotlin 1.2.71本稿記述時の最新版

Linux に Kotlin コンパイラをインストールする方法は、下記の通り 2 種類あります。
インストール方法設置先
(ローカルユーザ)
設置先
(システム)
備考
A. 圧縮ファイルを展開してインストール展開されたディレクトリをシステムのディレクトリに
コピーすることにより、複数アカウントで使用可能。
B. SDKMAN を使用してインストール-ユーザごとにインストールが必要。
どちらもローカル (ユーザディレクトリ) にインストールできます。
ローカルにインストールする場合は管理者 (root) で作業する必要がありません。
その時は、不要になった時点でディレクトリごと削除できるため便利です。

本稿は、Kotlin の公式ページを参照して作成しました。

1. Kotlin をインストール
A. 圧縮ファイルを展開してインストール
A-1. 圧縮ファイルを取得する。
Web ブラウザで GitHub の Kotlin リリースページ を開き、
kotlin-compiler-1.2.71-linux-x64.zip (圧縮ファイル) をダウンロードする。
→ 要するに、
$ wget http://github.com/JetBrains/kotlin/releases/download/v1.2.71/kotlin-compiler-1.2.71-linux-x64.zip
でファイルを取得する。
A-2. 圧縮ファイルを解凍する。
$ unzip kotlin-compiler-1.2.71-linux-x64.zip

$ LANG=c tree ./kotlinc | head -15
./kotlinc
|-- bin
|   |-- kotlin
|   |-- kotlin-compiler
|   |-- kotlin-dce-js
|   |-- kotlinc
|   |-- kotlinc-js
|   |-- kotlinc-jvm
|   `-- rt
|       |-- bin
|       |   `-- unpack200
|       |-- jetrt
|       |   |-- dynlookup15008144.tbl
|       |   |-- libXAWT15008144.so
|       |   |-- libXCP215008144.so
解凍されたディレクトリは、こんな感じになる
A-3. 実行を確認する。
$ ./kotlinc/bin/kotlinc
REPL (対話モード) で実行を確認する。
Welcome to Kotlin version 1.2.71 (JRE 1.8.0_144-jdk_2017_08_24_20_46-b00)
Type :help for help, :quit for quit
>>> println("Hello, world!")⏎
Hello, world!
>>> :quit⏎
A-4. システムディレクトリへコピーする。
複数ユーザで使用する場合は、システムディレクトリにコピー (移動) する。

$ su
# mv ./kotlinc/ /usr/local/.
# chowon -R root:root /usr/local/kotlinc/
# exit
$ /usr/local/kotlinc/bin/kotlinc -version
info: kotlinc-jvm 1.2.71 (JRE 1.8.0_144-jdk_2017_08_24_20_46-b00)
2. コンパイルと実行

B. SDKMAN を使用してインストール
B-1. SDKMAN をインストールする。
なんとも怪しげだけれど、以下を実行する。
$ curl -s https://get.sdkman.io | bash
                                -+syyyyyyys:
                            `/yho:`       -yd.
                         `/yh/`             +m.
                       .oho.                 hy                          .`
                     .sh/`                   :N`                `-/o`  `+dyyo:.
                   .yh:`                     `M-          `-/osysoym  :hs` `-+sys:      hhyssssssssy+
                 .sh:`                       `N:          ms/-``  yy.yh-      -hy.    `.N-````````+N.
               `od/`                         `N-       -/oM-      ddd+`     `sd:     hNNm        -N:
              :do`                           .M.       dMMM-     `ms.      /d+`     `NMMs       `do
            .yy-                             :N`    ```mMMM.      -      -hy.       /MMM:       yh
          `+d+`           `:/oo/`       `-/osyh/ossssssdNMM`           .sh:         yMMN`      /m.
         -dh-           :ymNMMMMy  `-/shmNm-`:N/-.``   `.sN            /N-         `NMMy      .m/
       `oNs`          -hysosmMMMMydmNmds+-.:ohm           :             sd`        :MMM/      yy
      .hN+           /d:    -MMMmhs/-.`   .MMMh   .ss+-                 `yy`       sMMN`     :N.
     :mN/           `N/     `o/-`         :MMMo   +MMMN-         .`      `ds       mMMh      do
    /NN/            `N+....--:/+oooosooo+:sMMM:   hMMMM:        `my       .m+     -MMM+     :N.
   /NMo              -+ooooo+/:-....`...:+hNMN.  `NMMMd`        .MM/       -m:    oMMN.     hs
  -NMd`                                    :mm   -MMMm- .s/     -MMm.       /m-   mMMd     -N.
 `mMM/                                      .-   /MMh. -dMo     -MMMy        od. .MMMs..---yh
 +MMM.                                           sNo`.sNMM+     :MMMM/        sh`+MMMNmNm+++-
 mMMM-                                           /--ohmMMM+     :MMMMm.       `hyymmmdddo
 MMMMh.                  ````                  `-+yy/`yMMM/     :MMMMMy       -sm:.``..-:-.`
 dMMMMmo-.``````..-:/osyhddddho.           `+shdh+.   hMMM:     :MmMMMM/   ./yy/` `:sys+/+sh/
 .dMMMMMMmdddddmmNMMMNNNNNMMMMMs           sNdo-      dMMM-  `-/yd/MMMMm-:sy+.   :hs-      /N`
  `/ymNNNNNNNmmdys+/::----/dMMm:          +m-         mMMM+ohmo/.` sMMMMdo-    .om:       `sh
     `.-----+/.`       `.-+hh/`         `od.          NMMNmds/     `mmy:`     +mMy      `:yy.
           /moyso+//+ossso:.           .yy`          `dy+:`         ..       :MMMN+---/oys:
         /+m:  `.-:::-`               /d+                                    +MMMMMMMNh:`
        +MN/                        -yh.                                     `+hddhy+.
       /MM+                       .sh:
      :NMo                      -sh/
     -NMs                    `/yy:
    .NMy                  `:sh+.
   `mMm`               ./yds-
  `dMMMmyo:-.````.-:oymNy:`
  +NMMMMMMMMMMMMMMMMms:`
    -+shmNMMMNmdy+:`


                                                                 Now attempting installation...


Looking for a previous installation of SDKMAN...
SDKMAN found.

======================================================================================================
 You already have SDKMAN installed.
 SDKMAN was found at:

    /home/User/.sdkman

 Please consider running the following if you need to upgrade.

    $ sdk selfupdate force

======================================================================================================
この怪しげな実行により、/home/User/.sdkman/ が作成され、
.bashrc (ログインごとに実行されるファイル) の末尾に以下が追加される。

#THIS MUST BE AT THE END OF THE FILE FOR SDKMAN TO WORK!!!
export SDKMAN_DIR="/home/User/.sdkman"
[[ -s "/home/User/.sdkman/bin/sdkman-init.sh" ]] && source "/home/User/.sdkman/bin/sdkman-init.sh"
User は、作業中のユーザ ID を指します。適宜自分の ID に読み替えてください。
$ LANG=c tree .sdkman/ | head -15
.sdkman
|-- archives
|-- bin
|   `-- sdkman-init.sh
|-- candidates
|-- etc
|   `-- config
|-- ext
|-- src
|   |-- sdkman-availability.sh
|   |-- sdkman-broadcast.sh
|   |-- sdkman-cache.sh
|   |-- sdkman-current.sh
|   |-- sdkman-default.sh
|   |-- sdkman-env-helpers.sh
|   |-- sdkman-flush.sh
|   |-- sdkman-help.sh
B-2. SDKMAN を使用して kotlin をインストールする。
上記 B-1 により、ログインすれば (.bashrc が自動実行されることにより) コマンド sdk を使えるようになった。
なので、別の端末を開いて (同一のアカウントでログインしなおす)、Kotlin のインストールを続行する。

$ sdk install kotlin
==== BROADCAST =================================================================
* 17/10/18: sbt 1.2.5 released on SDKMAN! #scala
* 16/10/18: Springboot 2.0.6.RELEASE released on SDKMAN! #springboot
* 16/10/18: Micronaut 1.0.0.RC3 released on SDKMAN! #micronautfw
================================================================================

Downloading: kotlin 1.2.71

In progress...

#################### << kotlin がダウンロードされてゆく>> ############### 100.0%

Installing: kotlin 1.2.71
Done installing!


Setting kotlin 1.2.71 as default.
$ which kotlinc
~/.sdkman/candidates/kotlin/current/bin/kotlinc

$ LANG=c tree .sdkman/ | head -15
.sdkman
|-- archives
|   `-- kotlin-1.2.71.zip
|-- bin
|   `-- sdkman-init.sh
|-- candidates
|   `-- kotlin
|       |-- 1.2.71
|       |   |-- bin
|       |   |   |-- kotlin
|       |   |   |-- kotlin-dce-js
|       |   |   |-- kotlin-dce-js.bat
|       |   |   |-- kotlin.bat
|       |   |   |-- kotlinc
|       |   |   |-- kotlinc-js
SDKMAN を使用して kotlin をインストールした場合は、./sdkman/candidates/kotlin/ として配置される。
B-3. 実行を確認する。
$ kotlinc
REPL (対話モード) で実行を確認する。
Welcome to Kotlin version 1.2.71 (JRE 1.8.0_144-jdk_2017_08_24_20_46-b00)
Type :help for help, :quit for quit
>>> println("Hello, world!")⏎
Hello, world!
>>> :quit⏎
2. コンパイルと実行

2. コンパイルと実行
2-1. ソースファイルを作成する。
$ cat > hello.kt << EOF
fun main(args: Array<String>) {
    println("Hello, World!")
}
EOF


$ cat hello.kt
fun main(args: Array<String>) {
    println("Hello, World!")
}
2-2. コンパイルする。
$ kotlinc hello.kt -include-runtime -d hello.jar
kotlinc は、上記 B でインストールしたときの実行例です。読み替えて実行してください。
./kotlinc/bin/kotlincA-3 でインストールした場合
/usr/local/kotlinc/bin/kotlincA-4 でインストールした場合
kotlincB でインストールした場合
$ ls -gGh hello.jar
-rw-rw-r--. 1 928K 10月 17 15:04 hello.jar
ランタイムライブラリもリンク (-include-runtime) したので、サイズが大きい。
2-3. 実行する。
$ which java
/bin/java
$ java -version
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
$ java -jar hello.jar
Hello, World!