投稿者:國藤 篤規(エヌアイシーソフト)

こんにちは。
IBM Cloud の Cloud Foundry で Kotlin を動かしてみました。 結論としては、特にひっかかるところもなく動いたので、環境構築などを含めて手順をまとめておきます。

Kotlin とは


Kotlin とは、JetBrainsによって開発された JVM 言語( Java VM 上で動く、Java以外のプログラミング言語)の一種です。 2017年5月にgoogle が 、Android アプリを開発する際の言語として正式にサポートするという発表をして、一段と注目されるようになりました。2018年末(もうすぐですね)には、Androidアプリの開発言語としては、Javaと同等のシェアを得るのではという予想もあるようです。Kotlin成功のカギは、「Better Java」であろうとする理念だと思います。Java を根本から変えてしまうような機能を導入せず、それでいてより良く、易しく書けることを目指しています。また、Java との Interoperability (相互運用性)を掲げており、Java のクラスライブラリを特段の意識することなく呼び出すことができます。
今回は、Cloud Foundry なので、サーバサイドで Kotlin を動かしてみた、という記事です。

開発環境


Kotlin と同じく、JetBrains によって開発されている IntelliJ IDEA をIDE として選択しました。Plug in は、Ktor(今回使用する、Kotlin製Webフレームワーク)を使ったプロジェクトのセットアップが非常に楽になる、Ktor plugin をインストールしました。この Plugin をインストールすると、プロジェクトを新規作成する際にKtorのメニューが出るようになります。こちらから、必要なフィーチャーを選べば、サンプルコードが出力されます。(Spring の STSのようなモノ)

Ktor Plugin

ビルドシステムは Gradle を使います。こちらは IntelliJ IDEA をインストールすればそのまま使えます。今回は、簡単な掲示板のようなものを作りました。DB としてCloudant を使用しますので、Dependency に以下を追加します。

build.gradle

dependencies {
    ...
    compile 'com.cloudant:cloudant-client:2.13.1'
}

Java との Interoperability のおかげで、このようにJava用のライブラリもシームレスに使うことができます。これで、開発環境が整いました。開発をして、ローカルで動作確認します。

IBM Cloud へのディプロイ


ここからが本題の IBM Cloud へのディプロイですが、gradle のデフォルトのJarタスクは、Uber.jar(fat.jar) を作ってくれません。Uber.jar とは、作成したアプリケーションのclassファイルと、依存関係で使用しているjarファイルなどをひとまとめにした、巨大な jar ファイルです。cf push する際は、Uber.jar になっていた方が取り回しが良いので、この形にします。Uber.jar 作成のための Gradle plugin , shadow をインストールします。

build.gradle

buildscript {
    ...
    dependencies {
        ...
        classpath "com.github.jengelman.gradle.plugins:shadow:4.0.1"
    }
}
apply plugin: "com.github.johnrengelman.shadow"

こうすることで、gradle のタスクに shadowJarが追加されます。

Shadow jar

このタスクを起動すれば、build/libs 配下に Uber.jar が生成されます。 あとは、いつも通りの cf push で動作させることが出来ました。(トップ画像参照)

manifest.yml

applications:
  - path: build/libs/KotlinCF-0.0.1-all.jar
    name: KotlinCF
    memory: 1024M
    instances: 1
    disk_quota: 1024M
    services:
      - Cloudant-1t-ktolinCF

bluemix app push KotlinCF

おわりに


今回驚きだったのは、buildpack の指定も不要だったことです。Java との相互運用性の高さを実感できました。Java の資産を活用しながら、Better Java を享受できること、またそれが大掛かりな移行などを経ずに実現できるのは大きな強みだと感じました。サーバサイドでも今後注目される言語となりそうです。