我们有一个多模块 POM,它也作为所有涉及的子模块的父 POM。称它为 MultiModulePOM
。我们有大约 70 个模块,比如编号为 Module1
到 Module70
。
现在:这些模块中的前 30 个在编译时仅需要一组 JAR 文件。即 - scope=provided
。由于我们讨论的是一组 JAR 文件,因此让这 30 个模块保持同步非常乏味,而且一般来说,我不太喜欢复制定义。
于是,我陷入了dependency grouping的陷阱.似乎是个好主意,但它不适用于 provided
依赖项。换句话说:如果我将依赖的 JAR 分组在一个名为 ExtDependencies
的模块中,并使 Module1
依赖于 ExtDependencies
,则由ExtDependencies
不会被传递添加到 Module1
,因为它们的范围是提供的
。
(如果最后一段不正确,请告诉我,因为它真的可以让我摆脱困境)
我能看到的唯一其他选项是创建一个名为(例如)IntermediaryPOM
的父 POM。 IntermediaryPOM
扩展了 MultiModulePOM
并使用 scope=provided
征集依赖 JAR 文件集。模块 Module1
-Module30
然后扩展 IntermediaryPOM
。
这似乎可以解决问题,但我遇到了三个问题:
- 它添加了我不确定是否真的需要的另一层 POM。
- 后来,在分发期间,我发现自己还必须安装/部署中间 POM。
- 考虑一般情况:中间 POM 可能有其他兄弟用于其他 JAR 集(用于模块 31-50)。因此,此解决方案似乎无法很好地扩展。
所以我的问题是 - 根据您的经验,处理此问题的最佳方法是什么?这种用例有什么已知的最佳做法吗?
最佳答案
恐怕这里没有简单的解决方案。
你说得对,如果你在 ExtDependencies
中声明公共(public)依赖项作为provided
它们不会被添加到依赖于 ExtDependencies
的任何其他模块的类路径中.就是这样provided
有效。
但是你可以在没有范围的情况下声明这些常见的依赖关系(例如使用默认的 compile
范围)并添加 provided
依赖 ExtDependencies
.在这种情况下,所有 ExtDependencies
依赖项将添加到类路径中。天哪,那是很多“依赖” :)
您还提到了其他可能的选择——引入另一个抽象级别(您可能知道,这是解决几乎所有问题的一种方法)。但是这样的多级层次结构不太优雅,也更难维护(我在我们的项目中有它,所以我一直在)。
一般来说,我还没有遇到过如此规模的问题,但如果我要解决它,我会选择第一个选项,同时考虑范围界定建议。
关于java - 分组*提供*依赖项的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14757198/