AWS Lambda で NoClassDefFoundError

やろうとしたこと

AWS Lambda に jar をアップロードして実行したかった。

問題

jarを作成してAWSのコンソールにアップロードして実行すると、ローカルで作成した自作のモジュールのクラスが NoClassDefFoundError

環境

IntelliJ IDEA 2018.2.6 (Community Edition)
macOS 10.14.2
gradle-4.8-all
kotlin 1.2.71

やったこと

AWS ドキュメント - .zip デプロイパッケージの作成 (Java)

takeda-san.hatenablog.com

を参考に、以下のようなタスクを定義して ./gradlew :app:build

task buildZip(type: Zip) {
    from compileJava
    from compileKotlin
    from processResources
    into('lib') {
        from configurations.runtime
        from configurations.compileClasspath
    }
}
build.dependsOn buildZip

これでうまくいくはずだけど、AWSコンソールから実行すると NoClassDefFoundError と言われる。

jarをunzipしてlibを覗いてみると…

ローカルの自作モジュールがjarになってない!

原因

ローカルの自作モジュールに java-library プラグインを入れていたこと。

plugins {
    ...
    id 'java-library' // ←これ
}

とりあえずこれを消したらちゃんとjarを作ってくれてうまく実行できました。





AWS Lambda実践ガイド (impress top gear)

AWS Lambda実践ガイド (impress top gear)