Ponz Dev Log

ソース派のシステムエンジニアの開発日記

Gradleを使ってIBM Cloud Functions with Javaの関数を実装する

あけましておめでとうございます。新年一発目はサーバーレスです。 昨年はNode.jsしかほとんど触らなかったIBM Cloud Functions(OpenWhisk)をJavaで実装します。

ただし、公式のチュートリアルだと自力でgsonにCLASSPATH通してデプロイしてねと雑にしか書いていないので、こちらのブログのチュートリアルを使います。

www.ibm.com

とはいっても、作り方は2ステップで簡単です。 ブログ記事そのままですが、書き初めとうことで基本を押さえに行きます。

Javaの関数を書く

ポイントは2つ押さえておけばOKです。

  1. 実行する関数(厳密にはエントリーポイントとなるメソッドを指します)の名前は main 固定です。(別名にしてもいいけど仕組みに乗っかった方が楽)
  2. どうやらリクエストとレスポンスのJSONパーサーはgsonを使うことが推奨されています。(これ以外のJSONパーサーは使えないのかは未検証です)

簡単なHello worldは以下のようになります。

package com.example;

import com.google.gson.JsonObject;

public class Hello {

  public static JsonObject main(JsonObject args) {
    // リクエストを受け取る
    String name = args.getAsJsonPrimitive("name").getAsString();
    // レスポンスを返す
    JsonObject response = new JsonObject();
    response.addProperty("greeting", "Hello " + name + "!");
    return response;
  }
}

JARに固めてデプロイする

gsonはIBM Cloud側で提供されているので依存関係にJARとして含めなくても良いのですが、これ以外にもライブラリを含めたいとかありますよね?DIするならgoogle-guiceとか、HTTPクライアントにOkHttp使いたいとか諸々。そんな時は公式のチュートリアルのようにいちいちクラスパスを通すのは時間の無駄なのでGradleで一気にまとめます。(Jarに固めればいいので、Mavenでもできるはず)

上のHello worldの例だと最小限の記述で以下のように書けます。単純に依存関係のJARの取得先と何を入れるのかを書くだけ。

apply plugin: 'java'
version = '1.0'
repositories {
    mavenCentral()
}
dependencies {
    compile 'com.google.code.gson:gson:2.8.5'
}

あとは ibmcloud fn action create hello-wsk-java build/libs/hello-wsk-java-1.0.jar --main com.example.Hello でデプロイするだけ! ちょっとした関数を書くにはJavaを使うのは億劫ですが、かなり簡単にできるんですね。