Help us understand the problem. What is going on with this article?

GAE/Kotlinをはじめる!

More than 3 years have passed since last update.

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が登場するのを待つか作るかをする必要がありそうでした。

参考

http://qiita.com/kumazo@github/items/7eeb83926a4265fb8d39

koki_cheese
Go/JavaScript/Firebase/GCP/Securityとかが好きです。
http://github.com/k2wanko
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした