我正在尝试让maven下载所有依赖项(编译,测试,插件等),以便我可以避免让我们的dockerized构建浪费不必要的时间一遍又一遍地下载它们.
我们已经对我们的maven构建进行了docker化,以便我们可以从jenkins运行它,而不需要在jenkins机器上安装许多构建特定的依赖项(Java,redis,maven依赖项等).我们的构建依赖于增量docker构建,它只执行实际需要重新运行的步骤.
我们的主要构建是一个DockerFile,有几个步骤来安装jdk,maven等.然后它做了
COPY ./pom.xml /opt/inbot-api/pom.xml
RUN mvn dependency:copy-dependencies clean
这会将依赖项下载到本地maven存储库,然后清除目标目录.
然后我们将源树复制到映像并运行完整的构建.
COPY ./src /opt/inbot-api/src
RUN mvn -e clean install
一般的想法是,在一台干净的机器上,docker将执行所有RUN步骤,但在增量构建时,它只会重新运行需要重新运行的东西.在每个运行步骤之后,它存储中间图像.因此,如果pom文件没有更改,则无需重新运行依赖项提取步骤,因为它会产生完全相同的结果.因此,它会加载已缓存的中间映像,其中包含已下载的所有依赖项.这正是我们想要的.
我们的DockerFile还有很多不太重要的东西,但最终它产生了一个包含我们编译工件的docker文件,一个nginx配置以及我们可以部署到ECS的所有运行时依赖项.
这几乎可以工作,除了mvn clean install
仍然下载每个构建的额外插件依赖项.因此,这些是复制依赖性步骤未涵盖的依赖项.
我的问题是,我如何RUN mvn dependency:copy-dependencies clean
下载所有依赖项,包括插件依赖项.我已经看到人们实际上做了一个mvn verify clean
而不是mvn dependency:copy-dependencies clean
但在我们的情况下这有点慢.我想知道是否有更好的方法来做到这一点.
我很感激有关如何改进这一点的任何反馈.
更新
我现在做了
RUN mvn -B -T 4 dependency:copy-dependencies dependency:resolve-plugins dependency:go-offline clean
之后它还会下载更多东西mvn clean install
.一个mvn -o clean install
仍然失败,尽管dependency:go-offline
.所以,这个插件似乎已经被打破了.