Я работаю над проектом Spring Boot 3.3 с Java 21 и реализую новую функцию поддержки CDS (обмен данными классов). Приложение представляет собой стандартное CRUD-приложение с REST API, которое подключается к базе данных PostgreSQL. Мой application.yml выглядит так:
spring:
datasource:
url: jdbc:postgresql://host.docker.internal:5433/mydatabase
username: myuser
password: secret
liquibase:
change-log: classpath:db/changelog/db.changelog-master.xml
contexts: schema, data
database-change-log-lock-table: ${liquibase.database-change-log-lock-table}
database-change-log-table: ${liquibase.database-change-log-table}
jpa:
properties:
hibernate.show_sql: false
hibernate.format_sql: true
hibernate.highlight_sql: true
hibernate.use_sql_comments: true
hibernate.generate_statistics: false
hibernate.hbm2ddl.auto: none # validate
audit:
enable-spring-jpa-listener: true
cache:
list:
- name: absence-by-id
time-to-live: 5m
enabled: true
default-time-to-live: 10m
enable-cache-validation: true
У меня также есть Dockerfile, который используется для сборки и запуска приложения. Dockerfile выглядит следующим образом:
FROM bellsoft/liberica-runtime-container:jdk-21-crac-cds-musl as builder
WORKDIR /home/app
ADD . /home/app/spring-boot-clean-architecture
RUN cd spring-boot-clean-architecture && ./mvnw -Dmaven.test.skip=true -Daether.dependencyCollector.impl=bf clean package
FROM bellsoft/liberica-runtime-container:jdk-21-cds-slim-musl
WORKDIR /home/app
COPY --from=builder /home/app/spring-boot-clean-architecture/target/*.jar app.jar
COPY --from=builder /home/app/spring-boot-clean-architecture/configuration/development/ config/
RUN mv config/application-development.yml config/application.yml
RUN java -Djarmode=tools -jar app.jar extract --layers --launcher
RUN cp -r app/application/* .
RUN cp -r app/dependencies/* .
RUN cp -r app/spring-boot-loader/* .
RUN java -Dspring.aot.enabled=true -XX:ArchiveClassesAtExit=./app/application.jsa -Dspring.context.exit=onRefresh org.springframework.boot.loader.launch.JarLauncher
EXPOSE 8080
ENTRYPOINT exec java $JAVA_OPTS -Dspring.aot.enabled=true -XX:SharedArchiveFile=./app/application.jsa org.springframework.boot.loader.launch.JarLauncher
Сборка Docker работает нормально, когда моя база данных PostgreSQL работает. Однако во время CI/CD, когда база данных может быть недоступна, сборка завершается с ошибкой Caused by: java.net.ConnectException: Connection refused
И ошибка сборки Docker:
>>> RUN java -Dspring.aot.enabled=true -XX:ArchiveClassesAtExit=./app/application.jsa -Dspring.context.exit=onRefresh org.springframework.boot.loader.launch.JarLauncher
--------------------
ERROR: failed to solve: process "/bin/sh -c java -Dspring.aot.enabled=true -XX:ArchiveClassesAtExit=./app/application.jsa -Dspring.context.exit=onRefresh org.springframework.boot.loader.launch.JarLauncher" did not complete successfully: exit code: 1
Я рассматриваю следующие подходы, но не уверен, какой из них лучше:
Как лучше всего обрабатывать зависимости базы данных в процессе сборки CI/CD, чтобы избежать вышеуказанных ошибок или использовать Spring Boot с поддержкой CDS?
@Random Guy, ты решил эту проблему?
Да, я это сделал, мне помогли документы Скотта, поэтому, используя свойства в application.yml, я обеспечил успешный «пробный прогон», который я искал. github.com/spring-projects/spring-lifecycle-smoke-tests/blob/…




Как отметил Скотт в комментариях, существуют варианты настройки тестового запуска для JPA, JDBC, R2DBC, Spring Batch, Liquibase..., которые документированы прямо здесь https://github.com/spring-projects/spring -lifecycle-smoke-tests/blob/main/README.adoc#training-run-configuration
Использование тех из моего файла application.yml, которые использовались для этого запуска CDS, обеспечило успешный запуск и позволило мне использовать поддержку CDS. Еще раз спасибо, Скотт!
Поделитесь подробностями, например, какие действия вы предприняли для решения проблемы. Это поможет в будущем. Поскольку срок действия ссылок может истекать с течением времени
Несколько советов по работе с внешними соединениями во время обучения описаны здесь: github.com/spring-projects/spring-lifecycle-smoke-tests/blob/…