Skip to content

shinyay/spring-just-boot-kotlin

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

spring-just-boot-kotlin

前提 / 環境

ランタイムバージョン

  • Kotlin : 1.3.0
  • SpringBoot : 2.1.0.RELEASE

ちなみに、SPRING INITIALIZR で生成した状態では、デフォルトの Kotlin バージョンは、1.2.70 (as of 2018/11/1) でした。

Spring Dependencies

  • Web

開発環境

  • OS : Mac
  • IDE : IntelliJ IDEA
  • Build : Gradle

手順 / 解説

SPRING INITIALIZR で生成した雛形を IntelliJ にインポートして使用します。 前述したとおり、Kotlin のバージョンは1.2.70 から 1.3.0 に変更しています。

SPRING INITIALIZR

SPRING INITIALIZR は、文字通り Spring プロジェクトの雛形を作り簡単に始められるようにするためのオンラインツールです。 操作は非常にシンプルで以下の項目を画面上から選択するみです。

  • プロジェクトタイプ : [ Maven / Gradle]
  • 開発言語 : [Java / Kotlin / Groovy]
  • Spring Boot バージョン : Spring Initializr 2018-11-02 00-13-42.png
  • Group : ルートパッケージ名
  • Artifact : プロジェクト名
  • Dependencies : 依存コンポーネント
    • 今回は Web を追加

Spring Initializr 2018-11-02 00-03-21.png

Java/Kotlin ともに Generate Project をクリックすると、Spring プロジェクトの雛形が生成されてダウンロードできます。 その雛形を IDE にインポートして使用します。

今回の Java プロジェクト

Spring Initializr 2018-11-01 21-50-43.png

今回の Kotlin プロジェクト

Spring Initializr 2018-11-01 21-51-57.png

build.gradle の比較

以下に記述している Java プロジェクト用の build.gradle と Kotlin プロジェクト用の build.gradle を比較してみます。

当然ですが基本的には両者の記述内容や書式は同じな事が分かります。 異なる点は、次の2点です。

  • 適用プラグイン
  • 依存ライブラリ

プラグインは、Kotlin プロジェクトでは Java プラグインの代わりに Kotlin プラグインを適用しています。

apply plugin: 'kotlin'
apply plugin: 'kotlin-spring'

同様に依存ライブラリについても、Kotlinのライブラリを追加しています。

implementation('com.fasterxml.jackson.module:jackson-module-kotlin')
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
implementation("org.jetbrains.kotlin:kotlin-reflect")

追加しているスタンダードライブラリが jre でなく jdk になっているのは、また別の話で。 いずれにしても、jdk を指定してください。

Java

buildscript {
	ext {
		springBootVersion = '2.1.0.RELEASE'
	}
	repositories {
		mavenCentral()
	}
	dependencies {
		classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
	}
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

group = 'io.pivotal.syanagihara'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
	mavenCentral()
}


dependencies {
	implementation('org.springframework.boot:spring-boot-starter-web')
	testImplementation('org.springframework.boot:spring-boot-starter-test')
}

Kotlin

buildscript {
	ext {
		kotlinVersion = '1.3.0'
		springBootVersion = '2.1.0.RELEASE'
	}
	repositories {
		mavenCentral()
	}
	dependencies {
		classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
		classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}")
		classpath("org.jetbrains.kotlin:kotlin-allopen:${kotlinVersion}")
	}
}

apply plugin: 'kotlin'
apply plugin: 'kotlin-spring'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

group = 'io.pivotal.syanagihara'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
compileKotlin {
	kotlinOptions {
		freeCompilerArgs = ["-Xjsr305=strict"]
		jvmTarget = "1.8"
	}
}
compileTestKotlin {
	kotlinOptions {
		freeCompilerArgs = ["-Xjsr305=strict"]
		jvmTarget = "1.8"
	}
}

repositories {
	mavenCentral()
}


dependencies {
	implementation('org.springframework.boot:spring-boot-starter-web')
	implementation('com.fasterxml.jackson.module:jackson-module-kotlin')
	implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
	implementation("org.jetbrains.kotlin:kotlin-reflect")
	testImplementation('org.springframework.boot:spring-boot-starter-test')
}

Mainクラス の比較

Mainクラスの比較も、Java / Kotlin で全く同じですね。 Main メソッドの書式が Java スタイルか、Kotlin Kotlin スタイルかの違いだけです。

public static void main(String[] args) {
	SpringApplication.run(SimpleApplication.class, args);
}
fun main(args: Array<String>) {
    runApplication<SimpleApplication>(*args)
}

配列

Kotlin では、Java における配列が存在しません。そこで、Array オブジェクトを用いて配列表現を行います。

Java の配列と Kotlin の配列で異なるのは、定義の仕方というよりも、性質が異なります。

  • Java 配列: 共変
    • 型パラメータ間の継承関係を考慮しない
  • Kotlin 配列: 不変
    • 型パラメータ間の継承関係を考慮

例えば、Mainメソッドのパラメータで利用しているArrayを、Arrayに対して代入するような事がKotlinではできません。 型を安全に保てるので、実行時エラーのリスクを回避することができます。

配列の展開

Java ではみなれない次のようなパラメータの記述があります。

*args

これは、配列の要素を展開して使用するときに利用する書式です。

Java

package io.pivotal.syanagihara.simple;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SimpleApplication {

	public static void main(String[] args) {
		SpringApplication.run(SimpleApplication.class, args);
	}
}

Kotlin

package io.pivotal.syanagihara.simple

import org.springframework.boot.runApplication
import org.springframework.boot.autoconfigure.SpringBootApplication

@SpringBootApplication
class SimpleApplication

fun main(args: Array<String>) {
    runApplication<SimpleApplication>(*args)
}

About

The simplest SpringBoot App which is just generated at SPRING INITIALIZR

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages