获取所有maven依赖项,包括插件依赖项

时间:2015-12-10 13:28:50

标签: maven docker

我试图让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 installdependency:go-offline仍然失败。所以,这个插件似乎已经坏了。

3 个答案:

答案 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