IBM Cloud で Kotlin を動かす
投稿者:國藤 篤規
こんにちは。
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のようなモノ)
ビルドシステムは 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
が追加されます。
このタスクを起動すれば、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 を享受できること、またそれが大掛かりな移行などを経ずに実現できるのは大きな強みだと感じました。サーバサイドでも今後注目される言語となりそうです。