我试图让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
仍然失败。所以,这个插件似乎已经坏了。
答案 0 :(得分:1)
对于插件,我建议使用mvn dependency:resolve-plugins
请参阅文档:https://maven.apache.org/plugins/maven-dependency-plugin/
答案 1 :(得分:0)
我几乎可以解决这个问题:
RUN mvn install -DskipTests dependency:resolve dependency:resolve-plugins
答案 2 :(得分:0)
这对我有用,没有其他依赖项可供下载:
RUN mvn -B dependency:resolve dependency:resolve-plugins