【发布时间】:2013-01-19 14:08:37
【问题描述】:
在使用 Maven 一段时间后,我对 Maven 为构建架构带来的许多特性感到兴奋,尤其是依赖关系管理。但是,我一次又一次地遇到一个问题——Maven 如何解决多模块项目之间的依赖关系。我想知道这是否是当前 Maven 实现的大缺陷和/或是否有任何令人满意的解决方法。
假设我有一个多模块 Maven 项目。 Parent pom 包含三个模块——moduleA (jar)、moduleB (jar) 和moduleC(war)。 B 依赖于 A,C 依赖于 B。够简单吗?现在我想在父项目中运行mvn dependency:go-offline,它应该解决所有依赖项并将它们带入本地 .m2 目录。它失败是因为 Maven 抱怨它在作用于模块 B 时无法解决模块 A 的依赖关系。因为所有这些模块都属于一个groupId,所以我什至尝试使用-DexcludeGroupIds=x.y.z 来排除这些模块依赖关系,但它仍然在同一点失败。
我理解 Maven 抱怨的原因 - moduleA 尚未构建,因此当执行脱机目标时,我的本地或内部存储库中没有 moduleA:jar 工件。但恕我直言,插件应该以不同的方式处理这些模块间依赖关系。在这种情况下,它应该简单地忽略它。有人可能会争辩说我可以简单地执行mvn clean install,这会将moduleA:jar 安装到本地存储库中。之后,运行mvn dependency:go-offline 肯定会起作用。但是这种解决方法违背了这个离线目标的目的。这个插件允许我们在不构建整个项目的情况下解析和拉取依赖项到我们的本地存储库中。我在另一个案例中使用了dependency:copy-dependencies 目标,它也有同样的问题。
我在其他情况下也遇到过类似的问题:"mvn clean generate-source" could not resolve dependencies。当我运行mvn clean compile 时,一切正常,但是当我运行mvn clean generate-source 时,它失败了,因为 Maven 无法解析模块间依赖关系。在这种情况下,这是由 antrun 插件中的@requiresDependencyResolution 引起的。
由于 antrun 插件和依赖插件都在 Maven 世界中非常流行,我相信我不是唯一遇到这个问题的人。有人找到任何解决方案/解决方法吗?
【问题讨论】:
-
我已投票以“不具建设性”来结束这个问题。它可能写得很有说服力,但是我在那里看不到具体的问题。要求讨论 Maven 在其当前行为中是否“正确”并不适合本网站的问答模型。
-
Duncan,我也在寻找一种解决方法,而不是先执行 mvn clean install。也许我没有正确地用标题。我的目的是找到解决方案/解决方法,而不是争论 maven 的行为是否正确。
-
@DuncanJones 我修改了标题和问题以澄清我的意图。感谢您的评论。
-
@DuncanJones 这个问题在尝试创建多阶段 docker 构建时很痛苦,其中第一层将检索所有必需的外部依赖项,以便在后续调用中缓存它们(除非其中一个 pom文件更改)。
标签: maven dependency-management multi-module