【问题标题】:fetch all maven dependencies including plugin dependencies获取所有 Maven 依赖项,包括插件依赖项
【发布时间】:2015-12-10 13:28:50
【问题描述】:

我正在尝试让 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 下载更多内容。尽管dependency:go-offlinemvn -o clean install 仍然失败。所以,这个插件好像坏了。

【问题讨论】:

标签: java docker maven


【解决方案1】:

这对我有用,无需下载其他依赖项:

RUN mvn -B dependency:resolve dependency:resolve-plugins

【讨论】:

    【解决方案2】:

    对于插件我建议使用mvn dependency:resolve-plugins

    查看文档:https://maven.apache.org/plugins/maven-dependency-plugin/

    【讨论】:

    • 这几乎可以工作,但在我执行mvn dependency:copy-dependencies dependency:resolve-plugins clean 之后它仍然会下载一些其他内容。我尝试使用 -o 运行第二个 mvn 调用,然后失败:抱怨这些依赖项:“无法解析以下工件:org.apache.maven.reporting:maven-reporting-api:jar:2.0.9, org .apache.maven.doxia:doxia-sink-api:jar:1.0-alpha-10" 这似乎被 maven enforcer 插件间接使用,我们确实在使用。
    • 第二次调用正在运行额外的下载,因为您是第一次调用 install 内置目标。如果您将 install 目标添加到您的 mvn 第一次调用(在添加源之前),您将解决您的问题。
    • 我试图避免在这里进行完整的构建。这样做的重点是让 docker 在构建之前和复制源文件之前将依赖项缓存在单独的层中。无论如何,我已经转向 gradle。那里有同样的问题。对于大多数非平凡的项目,我认为这不能用 maven 或 gradle 干净地完成。如果可以就好了。但似乎总是有一些插件坚持运行时下载任何东西。
    【解决方案3】:

    我几乎解决了这个问题:

    RUN mvn install -DskipTests dependency:resolve dependency:resolve-plugins
    

    【讨论】:

    • 你的意思是:几乎解决?这是否解决了问题?
    • 在我的项目中,我有 maven-surefire-plugin 插件,他们有自己的依赖项,我做了什么来解决这个问题,在我运行上面的命令后,我运行一个“mvn 测试”并查看下载了哪些依赖项,我将这些依赖项放在<dependencies> 中就可以了。这是一种解决方法,但它对我有用。
    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2011-09-01
    • 2014-08-20
    • 1970-01-01
    • 2017-07-29
    • 2016-01-27
    • 1970-01-01
    相关资源
    最近更新 更多