Gradle Docker 下载依赖项

Posted

技术标签:

【中文标题】Gradle Docker 下载依赖项【英文标题】:Gradle Docker Download Dependencies 【发布时间】:2019-05-22 01:34:18 【问题描述】:

我有一个 Java Gradle Dockerfile,它设置 Gradle Wrapper、复制源文件、创建一个 Jarfile 并运行它:

FROM anapsix/alpine-java:9_jdk

WORKDIR /app

# Prepare Gradle
COPY build.gradle .
COPY gradle/wrapper/gradle-wrapper.jar ./gradle/wrapper/gradle-wrapper.jar
COPY gradle/wrapper/gradle-wrapper.properties ./gradle/wrapper/gradle-wrapper.properties
COPY gradlew .
RUN sh -c "./gradlew"

# Download depencencies here?

COPY . .

# Create Jar
RUN sh -c "./gradlew jar"

EXPOSE 7000

# Run Jar
CMD [ \
  "java", \
  "-jar", "./build/libs/projectname.jar" \
  ]

这工作正常,但是因为 jar 步骤是下载依赖项的第一阶段,每次我修改源代码时都需要重新下载所有依赖项。这使得构建周期比它需要的慢很多。

我想指示 gradle 在复制源文件之前的一个步骤中下载 build.gradle 文件中指定的依赖项。

我尝试在复制源代码之前简单地调用RUN sh -c "./gradlew compileJava",但 gradle 很“聪明”并说没有工作要做,而包含单个文件实际上会下载依赖项。

有没有办法像 build.gradle 中指定的那样简单地指示 Gradle 下载依赖项?或者最好的解决方法是什么?

编辑:我不是在问如何使用 Gradle 缓存,而是在问如何利用 docker 层来存储 gradle 依赖项。

【问题讨论】:

Docker cache gradle dependencies的可能重复 您可以使用自定义任务来完成,如下所示:***.com/a/33542886/750510 【参考方案1】:

一种解决方法是创建一个虚拟 java 文件并调用 compileJava 下载依赖项:

# Trick to get Gradle to download dependencies
RUN mkdir -p /app/src/main/java
RUN sh -c "echo 'public class Dummy ' > /app/src/main/java/Dummy.java && ./gradlew compileJava"

对我来说这似乎很愚蠢,但至少现在可以。

【讨论】:

以上是关于Gradle Docker 下载依赖项的主要内容,如果未能解决你的问题,请参考以下文章

Gradle 无法构建具有 Docker 依赖项的 JAR

Maven/Docker:缓存所有依赖项

Gradle 构建不下载依赖项

在 docker 中运行 playwright 时缺少依赖项

Gradle - 获取依赖项的 URL

Gradle:下载包含的 aar 库的依赖项