我有一个 Spring Boot、Maven 多模块项目,我正在使用 docker compose 运行该项目。该项目运行没有问题,但是,我无法使用 Spring Dev Tools 进行实时重新加载。
我的项目结构是:
my-service
- api (submodule)
- domain (submodule)
- entity (submodule)
- graphql (main-module)
- repository (submodule)
我的项目的 Dockerfile:
FROM openjdk:21-jdk-slim as dependencies
WORKDIR /app
COPY . .
RUN ./mvnw dependency:go-offline
FROM dependencies as build
RUN ./mvnw package spring-boot:repackage
FROM openjdk:21-jdk-slim as runtime
COPY --from=build /app/graphql/target/graphql-0.0.1-SNAPSHOT.jar /app/graphql/target/
EXPOSE 8080
CMD ["java", "-jar", "/app/graphql/target/graphql-0.0.1-SNAPSHOT.jar"]
FROM openjdk:21-jdk-slim as debug
COPY --from=build /app/graphql/target/graphql-0.0.1-SNAPSHOT.jar /app/graphql/target/
EXPOSE 5006
CMD ["java", "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5006", "-jar", "/app/graphql/target/graphql-0.0.1-SNAPSHOT.jar"]
我的 docker-compose.yml:
version: "3.8"
services:
my-service:
build:
context: .
target: debug
environment:
- SPRING_PROFILES_ACTIVE=local
volumes:
- "~/.m2:/root/.m2"
- ".:/app"
ports:
- "8080:8080"
- "5050:5006"
我一直在互联网上搜索任何有关使用 dockerized 多模块 Spring Boot 项目实现实时重新加载的文档,不幸的是我无法找到指导。
有人知道如何正确执行此操作吗?
我一直在尝试遵循这篇文章:https://medium.com/@kishieel/dockerize-your-spring-boot-application-with-hot-reloading-44ada09adf20,但是当我启动服务并发出GraphQL 查询,它只是不断收到有关类加载器的错误:
my-service-1 | java.lang.ClassCastException: class com.example.myservice.repository.MyClass cannot be cast to class com.example.myservice.repository.MyClass (com.example.myservice.repository.MyClass is in unnamed module of loader 'app'; com.example.myservice.repository.MyClass is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @3bbdbc95)
这就是我最终得到的结果:
docker-入口点.sh
#!/bin/bash
dos2unix mvnw
./mvnw spring-boot:run -Dspring-boot.run.jvmArguments="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005" &
while true; do
inotifywait -e modify,create,delete,move -r /app && ./mvnw compile
done
Dockerfile:
FROM openjdk:21-jdk-slim as dependencies
WORKDIR /app
COPY . .
FROM dependencies as build
RUN ./mvnw package spring-boot:repackage
FROM openjdk:21-jdk-slim as runtime
COPY --from=build /app/graphql/target/graphql-0.0.1-SNAPSHOT.jar /app/graphql/target/
EXPOSE 8080
CMD ["java", "-jar", "/app/graphql/target/graphql-0.0.1-SNAPSHOT.jar"]
FROM dependencies as debug
RUN apt-get update && apt-get -y upgrade
RUN apt-get install -y inotify-tools dos2unix
EXPOSE 5006
ENTRYPOINT ["./docker-entrypoint.sh"]
docker-compose.yml
my-service:
build:
context: .
target: debug
environment:
- SPRING_PROFILES_ACTIVE=local
volumes:
- "~/.m2:/root/.m2"
- ".:/app"