読者です 読者をやめる 読者になる 読者になる

アプリ開発備忘録

PlayStationMobile、Android、UWPの開発備忘録

IntelliJ+Jersey+Kotlinで環境構築

事の始まり

Raspberry PiAPIサーバー作るぜ!
KotlinかC#使いたいぜ
ASP.NET Coreはまだ早いな
Kotlinだ!
Android開発やPHPでよく使ってるからIntelliJだな。
Jerseyというものを使えば良いのか

ってな感じで選びましたが環境構築で詰みまくったのでここに記しておきます。

セットアップ

New Project

Spring Initializrを使います。
Kotlinを選択します。
自分はパッケージの部分はWarを選択しました。わかってる方はjarでも構いません。
f:id:matsudamper:20170506073217p:plain

Jerseyを選択。(Webが選択されているけど無くても動いたので要らない)
f:id:matsudamper:20170506073216p:plain

ビルド

早速ビルド

エラー: メイン・メソッドがクラスcom.example.DemoApplicationで見つかりません。次のようにメイン・メソッドを定義してください。
   public static void main(String[] args)
またはJavaFXアプリケーション・クラスはjavafx.application.Applicationを拡張する必要があります


DemoApplication.ktを開きます。なるほど確かにstaticじゃない。

package com.example

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

@SpringBootApplication
class DemoApplication

fun main(args: Array<String>) {
    SpringApplication.run(DemoApplication::class.java, *args)
}


staticにしてあげる。

package com.example

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

@SpringBootApplication
class DemoApplication{
    companion object{
        fun main(args: Array<String>) {
            SpringApplication.run(DemoApplication::class.java, *args)
        }
    }
}

まだダメっぽい。

多数の決まりごとの上で動いているのでJavaから見た時に同じように見えないといけないっぽい。
※コメント欄でご指摘頂きました。
Kotlinにはstaticという概念が無いそうです。

というわけで@JvmStaticを付けてあげる。

package com.example

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

@SpringBootApplication
class DemoApplication{
    companion object{
        @JvmStatic fun main(args: Array<String>) {
            SpringApplication.run(DemoApplication::class.java, *args)
        }
    }
}


ビルド成功、以下にアクセス。
http://localhost:8080/

ダメですね。
そこでターミナルから起動してみる。

mvnw spring-boot:run

f:id:matsudamper:20170506073743p:plain:w500
動いてますね。
ここはよくわからない。
いちいちコマンド打つのも面倒なのでバッチファイルのプラグイン使って動かしている。
ちゃんとした方法分かる人は教えて。

API追加

それではAPIを追加していきましょう。
ここは躓くところではないので調べてね。

package com.example

import org.springframework.stereotype.Component

import javax.ws.rs.GET
import javax.ws.rs.Path

@Component
@Path("hello")
class Hello {

    @GET
    fun hello(): String {
        return "hello"
    }
}

spring-boot:runして以下にアクセス。
http://localhost:8080/hello

Whitelabel Error Page
f:id:matsudamper:20170506073743p:plain:w500
ダメっぽいですね。

環境設定

環境設定ファイルを追加します。
ルートを指定してあげます。

package com.example

import org.glassfish.jersey.server.ResourceConfig
import org.springframework.stereotype.Component

import javax.ws.rs.ApplicationPath

@Component
@ApplicationPath("/")
class JerseyConfig : ResourceConfig() {
    init {
        packages("com.example")
    }
}

f:id:matsudamper:20170506073953p:plain
動きましたね。

おまけ Tomcat8で動かす

※最初の選択画面でwarを選択した人向け

パッケージ化

mvnw package

target/demo-0.0.1-SNAPSHOT.war を好きな名前に変えます。
demo.warにします。

Tomcat8に配置

Tomcat8をダウンロードしてきて適当な場所に設置します。
webappsにdemo.warをコピーします。

bin/startup.batを起動して以下にアクセス。
http://localhost:8080/demo/hello

終わり

開発環境整えるのにメッチャ時間使いました…
まずSpring Initializr使わないでやろうとして詰んでJerseyConfig で詰んでKotlinで詰む。
なんか参考資料少ない気がするよ……
というわけでこれから開発頑張っていこうと思います。
ちなみにapt-getで入れたtomcatでは上手く動かなかったよ!