Spring Boot
Qué detecta Zenavo
Un repositorio con pom.xml o build.gradle(.kts) se compila con zbpack como Java. Es una aplicación Spring Boot cuando pom.xml tiene spring-boot-starter-parent, o el archivo de Gradle menciona org.springframework.boot.
| Maven | Gradle | |
|---|---|---|
| JDK | <java.version>, <maven.compiler.source> o <maven.compiler.target> en pom.xml | sourceCompatibility = … o targetCompatibility = … en build.gradle |
| Compilar | mvn clean dependency:list install -Dmaven.test.skip=true con el Maven de la imagen | gradle build -x test con Gradle 8.14.3 |
| Arrancar | java -Dserver.port=$PORT -jar target/*.jar | java -Dserver.port=$PORT -jar build/libs/*.jar |
El JDK es Eclipse Temurin, versión 17 si no se encuentra ninguna. Las pruebas se omiten, y no se usa el wrapper mvnw ni gradlew del proyecto. Un pom.xml con <packaging>war</packaging> ejecuta target/*.war. Zenavo pone en PORT el puerto del servicio, 8080 en las compilaciones de zbpack, y el comando de arranque se lo pasa a Spring como server.port.
Para arrancar la aplicación de otra forma, define ZBPACK_JAVA_ARGS en Settings → Build → zbpack options; el comando de arranque pasa a ser java seguido de ese valor, por ejemplo ZBPACK_JAVA_ARGS=-jar target/app.jar --spring.profiles.active=prod.
Antes de desplegar
Gradle: desactiva el jar plano. El plugin de Spring Boot para Gradle también escribe
*-plain.jar, que va primero enbuild/libsy no se puede ejecutar. Añade abuild.gradle:groovyjar { enabled = false }Gradle: indica la versión de Java donde zbpack la lee. zbpack solo lee
sourceCompatibilityenbuild.gradle. Un proyecto que define su versión con un toolchain, o que usabuild.gradle.kts, se compila con JDK 17 y falla con código más nuevo. AñadesourceCompatibility = '21'abuild.gradle, o usa tu propio Dockerfile (abajo).Comprobación de salud. Las aplicaciones Spring Boot tardan en arrancar. Usa una comprobación de salud HTTP en
/actuator/health(conspring-boot-starter-actuator) y un periodo de arranque de 60 segundos o más.
Conecta una base de datos
Spring lee URL JDBC, no la cadena de conexión postgresql://, así que construye una con las variables de host y puerto de la base de datos:
SPRING_DATASOURCE_URL=jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/zenavo
SPRING_DATASOURCE_USERNAME=postgres
SPRING_DATASOURCE_PASSWORD=${POSTGRESQL_DB_PASSWORD}Para MySQL: jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT}/zenavo con el usuario root y ${MYSQL_DB_PASSWORD}. La base de datos se llama zenavo en las bases de datos añadidas desde la consola (Bases de datos). Ejecuta las migraciones de Flyway o Liquibase al arrancar, que es lo que hace Spring Boot por defecto cuando cualquiera de ellos está en el classpath.
Memoria
La JVM dimensiona el heap a partir de la memoria del contenedor. Define un límite de memoria para el servicio y deja que el heap use la mayor parte con una variable:
JAVA_TOOL_OPTIONS=-XX:MaxRAMPercentage=75Tu propio Dockerfile
Un Dockerfile en el directorio raíz se usa en lugar de zbpack: úsalo para el wrapper de Gradle, compilaciones con Kotlin DSL o una imagen de ejecución más pequeña.
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"]Con Maven, compila con ./mvnw -DskipTests package y copia target/*.jar. El puerto del servicio sale de EXPOSE; Spring escucha en el 8080 por defecto.
Problemas habituales
| Síntoma | Causa |
|---|---|
no main manifest attribute, in build/libs/…-plain.jar | Gradle también compiló el jar plano. Desactiva la tarea jar. |
invalid target release: 21 o release version 21 not supported | zbpack eligió JDK 17. Define sourceCompatibility en build.gradle o <java.version> en pom.xml, o usa un Dockerfile. |
| El despliegue falla la comprobación de salud antes de que arranque la aplicación | El periodo de arranque es demasiado corto. Auméntalo en la comprobación de salud. |
OutOfMemoryError, o el servicio se reinicia con carga | El heap es demasiado pequeño o mayor que el límite de memoria. Define un límite de memoria y JAVA_TOOL_OPTIONS=-XX:MaxRAMPercentage=75. |
Failed to configure a DataSource | Falta SPRING_DATASOURCE_URL o no es una URL jdbc:. |