本文へスキップ

Spring Boot ​

Zenavo が検出する内容 ​

pom.xml または build.gradle(.kts) があるリポジトリは zbpack で Java としてビルドされます。pom.xml に spring-boot-starter-parent がある場合、または Gradle のファイルに org.springframework.boot がある場合に Spring Boot アプリと判断されます。

MavenGradle
JDKpom.xml の <java.version>、<maven.compiler.source>、<maven.compiler.target>build.gradle の sourceCompatibility = … または targetCompatibility = …
ビルドイメージの Maven で mvn clean dependency:list install -Dmaven.test.skip=trueGradle 8.14.3 で gradle build -x test
起動java -Dserver.port=$PORT -jar target/*.jarjava -Dserver.port=$PORT -jar build/libs/*.jar

JDK は Eclipse Temurin で、バージョンが見つからなければ 17 です。テストはスキップされ、プロジェクトの mvnw や gradlew ラッパーは使われません。pom.xml に <packaging>war</packaging> があれば target/*.war を実行します。Zenavo は PORT をサービスのポート(zbpack のビルドでは 8080)に設定し、起動コマンドがそれを Spring の server.port として渡します。

別の方法で起動するには、Settings → Build → zbpack options で ZBPACK_JAVA_ARGS を設定します。起動コマンドは java にそれを続けたものになります。例:ZBPACK_JAVA_ARGS=-jar target/app.jar --spring.profiles.active=prod。

デプロイする前に ​

  • Gradle:plain jar をオフにする。 Spring Boot の Gradle プラグインは *-plain.jar も書き出します。これは build/libs で先に並び、実行できません。build.gradle に追加してください。

    groovy
    jar {
        enabled = false
    }
  • Gradle:zbpack が読む場所に Java のバージョンを書く。 zbpack が読むのは build.gradle の sourceCompatibility だけです。toolchain でバージョンを指定するプロジェクトや build.gradle.kts を使うプロジェクトは JDK 17 でビルドされ、新しいコードでは失敗します。build.gradle に sourceCompatibility = '21' を追加するか、自分の Dockerfile を使ってください(後述)。

  • ヘルスチェック。 Spring Boot アプリは起動に時間がかかります。/actuator/health への HTTP のヘルスチェック(spring-boot-starter-actuator が必要)を使い、開始猶予時間を 60 秒以上にしてください。

データベースに接続する ​

Spring が読むのは postgresql:// の接続文字列ではなく JDBC の URL なので、データベースのホストとポートの変数から組み立てます。

sh
SPRING_DATASOURCE_URL=jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/zenavo
SPRING_DATASOURCE_USERNAME=postgres
SPRING_DATASOURCE_PASSWORD=${POSTGRESQL_DB_PASSWORD}

MySQL なら jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT}/zenavo、ユーザーは root、パスワードは ${MYSQL_DB_PASSWORD} です。コンソールから追加したデータベースの名前は zenavo です(データベース)。マイグレーションは Flyway か Liquibase で起動時に実行します。どちらかがクラスパスにあれば Spring Boot はデフォルトでそうします。

メモリ ​

JVM はコンテナのメモリからヒープのサイズを決めます。サービスにメモリ上限を設定し、変数でヒープがその大部分を使えるようにします。

sh
JAVA_TOOL_OPTIONS=-XX:MaxRAMPercentage=75

自分の Dockerfile を使う ​

ルートディレクトリの Dockerfile は zbpack の代わりに使われます。Gradle ラッパー、Kotlin DSL のビルド、小さなランタイムイメージを使いたいときに便利です。

dockerfile
FROM eclipse-temurin:21-jdk AS build
WORKDIR /src
COPY . .
RUN ./gradlew bootJar --no-daemon

FROM eclipse-temurin:21-jre
COPY --from=build /src/build/libs/*.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]

Maven なら ./mvnw -DskipTests package でビルドし、target/*.jar をコピーします。サービスのポートは EXPOSE から決まり、Spring はデフォルトで 8080 を待ち受けます。

よくある問題 ​

症状原因
no main manifest attribute, in build/libs/…-plain.jarGradle が plain jar もビルドしています。jar タスクを無効にしてください。
invalid target release: 21 や release version 21 not supportedzbpack が JDK 17 を選びました。build.gradle の sourceCompatibility か pom.xml の <java.version> を設定するか、Dockerfile を使ってください。
アプリが起動する前にヘルスチェックでデプロイが失敗する開始猶予時間が短すぎます。ヘルスチェックで延ばしてください。
OutOfMemoryError、または負荷がかかるとサービスが再起動するヒープが小さすぎるか、メモリ上限を超えています。メモリ上限と JAVA_TOOL_OPTIONS=-XX:MaxRAMPercentage=75 を設定してください。
Failed to configure a DataSourceSPRING_DATASOURCE_URL がないか、jdbc: の URL ではありません。

Zeabur とは関係ありません。