如何将 Spring Dev Tools Live Reload 与在 Docker Compose 中运行的 Maven 多项目结合使用

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

我有一个 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)

spring-boot maven docker-compose spring-boot-devtools maven-multi-module
1个回答
0
投票

这就是我最终得到的结果:

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"
© www.soinside.com 2019 - 2024. All rights reserved.