14
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

GAE/Kotlinをはじめる!

Kotlin Advent Calendar 2015の16日目の記事です。

KotlinはJVMで動くプログラミング言語です。
イマドキの文法とタイプセーフな型システムでさくさく安全に書ける言語です。

そしてGoogle App EngineはGoogle.comと同じインフラでアプリケーションを動かせるGoogleのPaaSでサポートされている言語はPython/Java/PHP/Goです。

どんなサイズのアプリケーションも最初っからスケールを意識して書かなければいけなくてちょっと掴みづらいですが最近は日本語のドキュメントも増えつつあるので初心者にも扱えるようになってきてるのではないかなと思います。

特に料金も無料枠があるので使われなければお金がかからないし
突然大量のアクセスがあってもスケールが容易なので個人開発やスタートアップにはオススメのプラットフォームといえると思います。

環境

MacOSX
Google Cloud SDK 1.9.28
Kotlin 1.0.0-beta-2423

プロジェクト作成

ディレクトリを作成して gradle initでプロジェクトを作り

build.gradleを編集します。

build.gradle
buildscript {
    ext.kotlin_version = '1.0.0-beta-2423'
    ext.gae_sdk_version = '1.9.28'
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.google.appengine:gradle-appengine-plugin:1.9.18'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

repositories {
    jcenter()
}

apply plugin: 'java'
apply plugin: 'kotlin'
apply plugin: 'war'
apply plugin: 'appengine'

sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7

dependencies {
    appengineSdk "com.google.appengine:appengine-java-sdk:$gae_sdk_version"

    compile 'javax.servlet:servlet-api:2.5'
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    compile "com.google.appengine:appengine-api-labs:$gae_sdk_version"
    compile 'net.sf.jsr107cache:jsr107cache:1.1'
    compile "com.google.appengine:appengine-jsr107cache:$gae_sdk_version"

    testCompile "com.google.appengine:appengine-api-stubs:$gae_sdk_version"
    testCompile "com.google.appengine:appengine-testing:$gae_sdk_version"
}

appengine {
    downloadSdk = true
    appcfg {
        oauth2 = true
    }
}

task layout << {
    sourceSets*.allSource.srcDirs*.each { it.mkdirs() }
    new File(sourceSets.main.resources.srcDirs[0], 'META-INF').mkdirs()
    new File(webAppDir, 'WEB-INF').mkdirs()
}

./gradlew layoutでsrcディレクトリなども作成できます。
IntelliJなどでプロジェクトを読み込んでおくと作業が楽になります。

Hello GAE/Kotlin

公式ドキュメントのコードをKotlinにしただけなのでコードは面白みありませんが一応

src/main/kotlinにパッケージを作成します。
今回はcom.inukoya.exampleで作成しました。

その直下にMyServlet.ktを作成します。

class MyServlet : HttpServlet() {

    public override fun doGet(req: HttpServletRequest, res: HttpServletResponse) {
        res.contentType = "text/plain"
        res.writer.println("Please use the form to POST to this url")
    }

    public override fun doPost(req: HttpServletRequest, res: HttpServletResponse) {
        val name = req.getParameter("name")
        res.contentType = "text/plain"
        if (name == null) {
            res.writer.println("Please enter a name")
        }
        res.writer.println("Hello $name")
    }
}

次にsrc/main/webapp/WEB-INF/appengine-web-app.xmlを作成します。

applicationにはapplicationIdを入れるのですが今回はローカルで動かすだけなので入れなくても大丈夫です。

appengine-web-app.xml
<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
    <application></application>
    <version>1</version>
    <threadsafe>true</threadsafe>
</appengine-web-app>

次にルーティングをします。appengine-web-app.xmlと同じディレクトリにweb.xmlを作成します。

web.xml
<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
    <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>com.inukoya.example.MyServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>

welcome-file-listのindex.htmlはsrc/main/webapp/に作成しておきます。

ここまでできたら後は以下のコマンドでdevサーバーを起動できます。

$ ./gradlew appengineRun

http://localhost:8080 にアクセスできればOKです。

スクリーンショット 2015-12-13 16.37.08.png

スクリーンショット 2015-12-13 16.37.12.png

コードはGitHubにあげています https://github.com/k2wanko/gae-kotlin-example

まとめ

思いつきでやってみましたが悪くはない気はします
でも、別に今のところはただのJavaの置き換えでしかないので
無理に使う必要性もない気はします。

KotlinのWebFrameworkもまだまだ発展途上なのでKotlinらしさを活かした
GAEで動くFrameworkが登場するのを待つか作るかをする必要がありそうでした。

参考

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
14
Help us understand the problem. What are the problem?