如何为依赖Library的Gradle多项目API-REST编写Dockerfile
Gradle多项目Docker部署依赖缺失问题解决
你的问题核心在于:API-REST子项目生成的普通JAR未包含依赖的Library模块代码,本地IntelliJ运行时会自动将Library加入类路径,而Docker容器中仅加载单独的JAR,导致依赖缺失。以下是两种可行的解决方法:
方案1:构建包含所有依赖的可执行JAR(推荐)
通过Gradle插件将Library模块及其他第三方依赖打包进一个可执行的"胖JAR"中,确保容器运行时能找到所有依赖类。
针对Spring Boot项目
Spring Boot自带的bootJar任务默认会打包所有依赖,只需确保API-REST的build.gradle配置正确:
plugins { id 'org.springframework.boot' version '2.7.15' // 替换为你的实际版本 id 'io.spring.dependency-management' version '1.0.15.RELEASE' id 'java' } dependencies { implementation project(':Library') // 其他第三方依赖... }
执行打包命令(在项目根目录运行):
./gradlew :API-REST:bootJar
生成的JAR文件路径为API-REST/build/libs/API-REST-0.0.1-SNAPSHOT.jar。
针对非Spring项目
引入Shadow插件来构建包含所有依赖的JAR:
plugins { id 'java' id 'com.github.johnrengelman.shadow' version '7.1.2' // 替换为最新版本 } dependencies { implementation project(':Library') // 其他第三方依赖... }
执行打包命令:
./gradlew :API-REST:shadowJar
生成的JAR文件路径为API-REST/build/libs/API-REST-0.0.1-SNAPSHOT-all.jar(默认带-all后缀)。
修改Dockerfile
根据生成的JAR路径调整Dockerfile:
FROM openjdk:11 EXPOSE 8080 RUN mkdir -p /app/ # Spring Boot项目用这行 ADD ./API-REST/build/libs/API-REST-0.0.1-SNAPSHOT.jar /app/api-rest.jar # 非Spring项目替换为Shadow生成的JAR # ADD ./API-REST/build/libs/API-REST-0.0.1-SNAPSHOT-all.jar /app/api-rest.jar ENTRYPOINT ["java", "-jar", "/app/api-rest.jar"]
注意:需在项目根目录执行docker build .,确保Docker能访问到子项目的JAR文件。
方案2:Docker多阶段构建(容器内完成编译)
直接在Docker容器中用Gradle镜像完成项目编译和打包,避免本地环境差异导致的依赖问题:
# 第一阶段:编译构建 FROM gradle:7.6-jdk11 AS builder WORKDIR /app COPY . . # Spring项目用bootJar,非Spring项目替换为shadowJar RUN gradle :API-REST:bootJar --no-daemon # 第二阶段:运行镜像 FROM openjdk:11 EXPOSE 8080 RUN mkdir -p /app/ COPY --from=builder /app/API-REST/build/libs/API-REST-0.0.1-SNAPSHOT.jar /app/api-rest.jar ENTRYPOINT ["java", "-jar", "/app/api-rest.jar"]
构建并运行:
docker build . -t api-rest docker run -p 8080:8080 api-rest
内容的提问来源于stack exchange,提问作者gilvictor
相关产品推荐
相关产品推荐

