Gradle Docker下载依赖项

时间:2018-12-21 15:19:56

标签: docker gradle gradle-dependencies

我有一个Java Gradle Dockerfile,它可以设置Gradle包装器,复制源文件,创建Jar文件并运行它:

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是“聪明的”,并说没有工作要做,而只包含一个文件实际上将下载依赖项。

是否有一种方法可以简单地指示Gradle按照build.gradle中的说明下载依赖项?还是最好的解决方法是什么?

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

1 个答案:

答案 0 :(得分:0)

一种解决方法是创建一个虚拟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"

对我来说,这似乎很愚蠢,但至少目前可以使用。