gpt4 book ai didi

maven - 如何解决多模块项目中模块之间的依赖关系?

转载 作者:行者123 更新时间:2023-12-03 14:39:23 25 4
gpt4 key购买 nike

在使用 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 Artifact 。但恕我直言,插件应该以不同的方式处理这些模块间依赖关系。在这种情况下,它应该简单地忽略它。有人可能会争辩说我可以简单地做 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 世界中非常流行,我相信我不是唯一遇到这个问题的人。有人找到任何解决方案/解决方法吗?

最佳答案

Maven 有一个“ react 器”的概念,其中在一次运行中构建的 Artifact (例如 maven package )在构建期间可用于依赖解析。例如,如果您的依赖关系图生成构建顺序 moduleA moduleB moduleC,而您执行 mvn package ,Maven会构建moduleA,打包它的 Artifact 并添加到reactor中,然后构建moduleB,打包它并添加到reactor中,然后对于moduleC也是如此。这意味着 moduleB 可以访问 moduleA 的 Artifact 以解决依赖关系,而 moduleC 可以访问 moduleA 和 moduleB。这仅在实际构建 Artifact 时才有效,即当您运行包目标时。

问题是,当您因为对 Artifact 不感兴趣而没有运行包目标时(对于您的 dependency:go-offline 示例),已处理的模块的 Artifact 不会被构建,因此不会添加到 react 堆。我也觉得这很烦人;我认为 Maven 应该查看其要构建的模块列表中的 POM 文件并在那里查看;但事实并非如此。

简而言之,解决您的问题的方法是 mvn package dependency:go-offline .这不会在您的本地存储库中安装 Artifact (我认为这是非常糟糕的做法),但它会在构建期间将它们放入 react 器中,这意味着 Maven 将能够解析从您的模块 B 到具有的模块 A 的依赖关系已经建成。缺点是每个模块都将被测试和打包,当你想要做的就是做很多工作dependency:go-offline .

无论哪种方式,希望这会有所帮助。

关于maven - 如何解决多模块项目中模块之间的依赖关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14694139/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com