スキップしてメイン コンテンツに移動

投稿

11月, 2021の投稿を表示しています

Spring Boot 2.5でplain.jarが生成されてApp Engine上でのアプリケーションの実行に失敗した話

Google App EngineのJava 11環境でSpring BootアプリケーションをGradleを使ってデプロイしたところ、ローカル上では正しくページ表示されるのに、App Engine上にデプロイすると、なぜか、500エラーになるというトラブルに遭遇しました。 Google Cloudのログを調べてみると下記のエラーログを発見しました。Spring Boot系のクラスがjarが含まれていない! java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext さらに調べると、アップロードされたjarファイル名が xxxx-0.0.1-SNAPSHOT-plain.jar のようになっていて、 plain.jarがアップロードされていることが根本原因 でした(Google App EngineのGradle Pluginのデフォルトの設定だとfat jarではなく、plain.jarが選択されるようです)。 plain.jarは、Spring Bootの2.5から作成されるようになったので、それ以前のSpring Bootのバージョンでは問題は発生しません。 [解決法1] build.gradleのjarプラグインの設定を変更 build.gradleのjarプラグインの設定でplain.jarが生成されないうように修正して、fat jarがデプロイされるようになりました。 jar { enabled = false } こちらの記事に感謝。 https://zenn.dev/donchan922/articles/ea76614f72b15e [解決法2] appengine.stage.artifactを指定 こちらは、試していませんが、appengine.stage.artifactにデプロイするターゲットのファイルを指定する方法もありかも知れません。 # build . gradleのappenineの設定でデプロイする対象ファイルを指定。 appengine { stage { artifact = "build/libs/xxxx-0.0.1-SNAPSHOT.jar"

Gradleで使用するJDKのバージョン指定

GradleでSpring Bootを使ったjavaのプロジェクトをビルドしようとしたところ、下記のエラーが発生しました。 $ ./gradlew build > Task :compileJava FAILED > FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':compileJava' . > invalid source release: 11 どうやら、Javaコンパイラが11に対応していない模様。複数のJDKをインストール(8と16)していて、JDK 8の方をデフォルトにしていたため、Java 11のソースがコンパイルできないことが発覚。 gradle.properies に下記のように org.gradle.java.home で使用するJDKを指定して解決。 # org.gradle.java.home=使用するJDKのパス # 例えば筆者の環境ではこんな感じ。 org.gradle.java.home=C:/Program Files/AdoptOpenJDK/jdk-16.0.1.9-hotspot