coffee break

某の情報系大学院生

Kotlin ~gradleでHello World~

kotlinてGUI開発ライブラリないのかよと憤慨していたがサードパーティー製でハイクオリティなtornadoFXというライブラリを見つけた。これはJavaFXを拡張してKotlinのコードで書けるようにしたものだ。開発が活発に進められていて、ガイドもしっかりしている(ただし全編英語)。いつか公式がこれをライブラリに組み込んでくれないかなーと期待。
github.com

だがこのライブラリを使うにはIDEAを使うか、mavenやgradleなどのビルドツールを使わなくてはならない。使わなくてもコンパイルまでは通せるが、実行すると謎の文言とともに大量のエラーを吐かれる。

そこで今回はまずgradleでkotlinのコードを実行できることを目標にする。gradleの導入は以下のサイトが非常にわかりやすく説明してくださっている。
qiita.com

フォルダ構成

今回はkotlinフォルダ直下のdemoフォルダにファイルを保存する。

├ src
│ ├ main
│ │ ├ kotlin
| | | ├ bin
| | | └ demo
│ │ └ java
│ └ test
│   ├ kotlin
│  └ java
├ build
| ├…
| …

└ build.gradle

HelloWorld.kt

クラスを持たない単純なhello world

package demo

fun main(args : Array<String>){
  println("Hello gradle!")
}

build.gradle

kotlin公式にこう書かれているのをちょっと編集する。
kotlinlang.org
tornadofxを使うことを見越して、今回はkotlin_version = '1.1.2'、kotlinOptions.jvmTarget = "1.8"を指定する。
これは先ほど挙げたtornadofxのサイトのReadMeに書いてある。

buildscript {
  ext.kotlin_version = '1.1.2'
  repositories {
    mavenCentral()
  }
  dependencies {
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
  }
}

apply plugin: 'kotlin'
apply plugin: 'application'

compileKotlin{
  kotlinOptions.jvmTarget = "1.8"
}

mainClassName = 'demo.HelloWorldKt'

defaultTasks 'run'

repositories {
  mavenCentral()
}

dependencies {
  compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
  testCompile 'junit:junit:4.11'
  testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"
}

task hello(type: JavaExec){
  main="demo"
  classpath = sourceSets.main.runtimeClasspath
}

javaでは一つのファイルに最低一つのクラスがあるので、taskの中にあるmain=でパッケージ名.mainメソッドを含むクラスネームを指定するが、kotlinはクラスを持たない場合もあるのでその時はパッケージ名のみを指定するのみでよいらしい。勘でやったらビルドできてしまったので詳しい仕様は知らない。またtaskのtype指定はJavaExecである。KotlinExecと書いたらそんなものはないと言われ失敗した。

上記のファイルを作成して>gradle buildを実行すると以下のように延々とダウンロードしながらビルドしてくれる。僕の環境では初回で20秒ほどかかっていた。オプションでDaemonを指定すれば次回以降は実行時間も短くなるかも?
f:id:mildtech:20170826213507p:plain
その後>gradle runを実行するとプログラムが走る。
結果は:runのすぐ下の行に出力される。ちゃんと正しくHello gradle!と表示されている。
f:id:mildtech:20170826213855p:plain

今後は実際にtornadofxを使って最低限のアプリ(ウィンドウ表示、ボタン、テキストボックスなどを備えたもの)を作っていこうと思う。