带有 CDS 支持的 Spring Boot 3.3 在构建过程中出现数据库错误

问题描述 投票:0回答:1

我正在使用 Java 21 开发 Spring Boot 3.3 项目,并且正在实现新的 CDS(类数据共享)支持功能。该应用程序是一个标准的 CRUD 应用程序,具有连接到 PostgreSQL 数据库的 REST API。我的 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

当我的 PostgreSQL 数据库运行时,Docker 构建工作正常。但是,在 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

我正在考虑以下方法,但不确定哪一种最好:

  1. 为 CI/CD 使用单独的 application.yml:配置 H2 数据库以确保应用程序启动而无需真正的 PostgreSQL 实例。
  2. 自动配置排除:排除 DataSourceAutoConfiguration 和 JpaRepositoriesAutoConfiguration,但这会导致错误,因为我的存储库 bean 需要实体管理器。 3.任何其他方法:还有其他方法可以更有效地处理这种情况吗?

在 CI/CD 构建过程中处理数据库依赖关系以避免上述错误或通过 CDS 支持接近 Spring Boot 的最佳实践是什么?

java spring-boot jvm
1个回答
0
投票

正如 Scott 在评论中提到的,这里有 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 支持。 再次感谢斯科特!

© www.soinside.com 2019 - 2024. All rights reserved.