我有一个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依赖项。
答案 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"
对我来说,这似乎很愚蠢,但至少目前可以使用。