![[tips][Kotlin] GradleでKotlin入門](https://casualdevelopers.com/wp-content/uploads/2017/05/kotlinlogo-700x300.png)
皆さん、お久しぶりです。Keidです。 気づくとかなり更新していませんでした。 え、何してたって?炎上案件に決まってるでしょ!察して(笑)
なぜ今Kotlinか?
KotlinはJetBrains社が開発したJVM系のプログラミング言語です。 2016年のリリースからジワジワ来ていて、今年のGoogle IO 2017でAndroidのKotlin対応が公式発表されました。 つまり、来年は皆Android開発をKotlinですることになるでしょう。 iOSもObjective-CからSwiftになったことですし、良い感じの変化ですね。
Kotlinで書くメリット
- Java100%互換なので、Javaの資産使い放題
- 「Null安全」という考え方により、ヌルポを防げる
- Andoridの場合は、古いjava6の文法から解放される(Java単体だとそろそろ9なのに)
- 何と言っても、AndroidのKotlin公式対応に余裕で追従できる
- それに、Javaプログラマはかなり移行しやすい文法(少なくとも俺は)
対象
- Javaを書ける人(Androidの知識はいらない)
- Gradleは知ってれば良い(まだMavenの人はこの機会に移行しましょう。)
- とにかく「Hello, Kotlin」したい人
この記事で書くこと
この記事で書かないこと
- Kotlinの詳細な文法(ググってね)
- KotlinによるAndorid開発入門
1. Kotlinの開発環境
1-1. Kotlinのインストール
まずはSDKMANをインストールします。
$ curl -s "https://get.sdkman.io" | bash
$ source "$HOME/.sdkman/bin/sdkman-init.sh"
$ sdk version
SDKMAN 5.5.9+231
続いてSDKMAN経由でKotlinをインストールします。
$ sdk install kotlin
$ kotlin -version
Kotlin version 1.1.2-2 (JRE 1.8.0_131-b11)
1-2. IDEの準備
現時点でKotlinの開発環境はIntelliJ IDEAの一択です。インストールしていない人はコミュニティ版を入れてください。
Homebrewがある人はCask経由でインストールできます。
$ brew cask install intellij-idea-ce
実はEclipseにも「Kotlin Plugin for Eclipse」というプラグインがありますが、全然ダメです。 どれくらいダメかは試してみてもらってもいいのですが、補完がイケてないですし、そもそもアプリケーション実行時にEclipseが落ちるので真面に使えません。
1-3. この記事読んでてまさかGradle入れていない人
そんな人はさっき入れたSDKMANからインストールできます。
$ sdk install gradle
2. GradleでのKotlinアプリケーション開発入門
2-1. まずJavaアプリケーションの雛形を作る
Gradleでinitコマンドを実行します。プロジェクト名は「hello-kotlin」にしますか。
$ mkdir hello-kotlin
$ cd hello-kotlin
$ gradle init --type java-application
$ cat build.gradle
apply plugin: 'java'
apply plugin: 'application'
repositories {
jcenter()
}
dependencies {
compile 'com.google.guava:guava:21.0'
testCompile 'junit:junit:4.12'
}
mainClassName = 'App'
その後でsrcフォルダの構成を変更します。ついでに不要なJavaファイルも消しましょう。
$ tree src/
src/
├── main
│ └── java
│ └── App.java
└── test
└── java
└── AppTest.java
$ rm -rf src/main/java/
$ rm -rf src/test/java/
$ mkdir src/main/kotlin
$ mkdir src/test/kotlin
$ tree src/
src/
├── main
│ └── kotlin
└── test
└── kotlin
ここでGradleをよく使う人なら「gradle init –type kotlin-application」はないのか?と思うと思いますが、現時点でありません。確かGradleのissueには上がっていましたよ。
2-2. Kotlinの設定を追加
Kotlinに必要なスクリプトとプラグインを設定ファイル(build.gradle)に記載します。
// kotlin script
buildscript {
ext.kotlin_version = '1.1.2-2'
repositories {
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
apply plugin: 'kotlin'
// apply plugin: 'java'
apply plugin: 'application'
repositories {
mavenCentral() // for kotlin plugins
jcenter()
}
dependencies {
// kotlin plugins
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"
// compile 'com.google.guava:guava:21.0'
testCompile 'junit:junit:4.12'
}
// mainClassName = ‘App’
ポイントは以下です。
-
- Kotlinのbuildscriptにより、「apply plugin: ‘kotlin’」が有効になる。
- Mavenリポジトリ上にある「kotlin-stdlib」及びテスト用の「kotlin-test-junit」のプラグインを設定している。
「mainClassName」は一旦コメントアウトしておきます。(あとで設定)
2-3. IDEからインポートする
IntelliJ IDEAを起動し、「import Project」から「hello-kotlin」プロジェクトをインポートします。
2-4. Hello Kotlin
「hello」パッケージを作成し、「Hello」クラスを作成しましょう。IDEから実行してみてください。
package hello
fun main(args: Array<string>) {
println("Hello, Kotlin!")
}
すでにJavaのおきまりの「public static void main」に比べるとシンプルです。
この程度のクラスならもっとシンプルに書けます。
fun main(args: Array<string> = println("Hello, Kotlin!")
2-5. Gradleで実行してみよう
先ほど作成したHello.ktクラスを「build.gradle」ファイルの「mainClassName」に追記します。
mainClassName = 'hello.HelloKt'
ポイントは以下です。
- build.gradle上ではHello.ktファイルを「Hello + Kt」として表現するところです。これはKotlinのmainのクラスファイルのデフォルトの命名規則です。
- 好きな名前のクラスファイルを作成したい場合は「@file:JvmName」 で以下のように指定すれば上記の条件は不要です。
@file:JvmName("Hello")
package hello
fun main(args: Array<string>) = println("Hello, Kotlin!")
mainClassName = 'hello.Hello'
それではコマンドラインから実行してみましょう。(もちろんIDEからもできます)
$ gradle run
:compileKotlin
Using kotlin incremental compilation
:compileJava NO-SOURCE
:copyMainKotlinClasses
:processResources NO-SOURCE
:classes UP-TO-DATE
:run
Hello, Kotlin!
BUILD SUCCESSFUL
Total time: 6.435 secs
2-6. ちなみに
いろいろコマンドラインでやっていますが、IntelliJ IDEAから「Create New Project」からのGradleプロジェクトでKotlinを選択すればほぼ同じ環境が出来上がります。え、今までの苦労は、、、でも、その代わりにGradleのKotlinの設定を理解できたはずです。
3. テストを書いてみよう
Helloクラスはテストを書くには微妙なので、無駄にラムダ式を使って書き直します。
package hello
fun main(args: Array) {
println(hello("kotlin"))
}
val hello: (String) -> String = {
val words = mutableListOf<string>()
words.add("Hello")
words.add(when (it.length) {
0 -> ""
1 -> it.toUpperCase()
else -> it[0].toUpperCase() + it.substring(1)
}).toString()
words.joinToString(separator = ", ").plus("!!")
}
HelloTestクラスのテストはこんな感じです。
package hello
import org.junit.Test
import kotlin.test.assertEquals
class HelloTest {
@Test fun testHelloHasMessage() {
assertEquals(expected = "Hello, Kotlin!!", actual = hello("kotlin"))
}
}
せっかくなので、コマンドラインからテストしてみましょう。
$ gradle test
:compileKotlin
Using kotlin incremental compilation
:compileJava NO-SOURCE
:copyMainKotlinClasses
:processResources NO-SOURCE
:classes UP-TO-DATE
:compileTestKotlin
Using kotlin incremental compilation
:compileTestJava NO-SOURCE
:copyTestKotlinClasses
:processTestResources NO-SOURCE
:testClasses UP-TO-DATE
:test
BUILD SUCCESSFUL
Total time: 13.342 secs
成功しました!
最後に
ここまでくれば、明日からKotlinでググりまくりながらアウトプットを出せます。新しい言語に億劫なのって結局最初だけですし、あとは文法勉強するだけですから。
久しぶりに書いたらQiitaみたいな書き方になってしまいました。個性死んじゃう(泣)
環境
- OS : macOS Sierra 10.12.4
- Kotlin : 1.1.2-2 (JRE 1.8.0_131-b11)
- Gradle : 3.5
- IntelliJ IDEA CE : 2017.1.3 Build #IC-171.4424.56