在使用 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 无法解决模块间依赖关系。在那种情况下,这是由@requiresDependencyResolution
antrun 插件引起的。
由于 antrun 插件和依赖插件都在 Maven 世界中非常流行,我相信我不是唯一遇到这个问题的人。有人找到任何解决方案/解决方法吗?