说我有一个多层的Maven项目,其中有两个模块和五个叶子。 (我的项目实际上有14个模块和78个叶子,但是我的问题仅需两个即可。)
父POM构建模块并使用 dependencyManagement 定义我的第三方依赖关系。
在模块POM中,我使用 dependencyManagement 声明我的“内部”依赖关系(例如 Module_A 是'common',而 Module_A2 取决于< em> Module_A1 )
parent POM
| -- DependencyManagement
| -- 3rd party dependencies (e.g. commons-logging, junit)
|
+-+-- Module_A POM
| | -- DependencyManagement
| | -- Project inter-dependencies (Module_A1, Module_A2)
| |
| +---- Module_A1 POM
| +---- Module_A2 POM (depends on _A1)
| +---- Module_A3 POM (depends on _A1, _A2)
|
+-+-- Module_B POM
| -- DependencyManagement
| -- Project inter-dependencies (Module_A1, Module_B1)
|
+---- Module_B1 POM (depends on _A1)
+---- Module_B2 POM (depends on _A1, _B1)
每个叶子( Module_A1 .. Module_B2 )声明其依赖项,而没有版本。父依赖项被声明为完整的方式,而AFAICT这是一个干净的Maven结构,并且大多数情况下都按预期运行。
我可以从 Module_A 的文件夹中构建 Module_A 没问题,一切正常。它发现在父POM级别声明的 commons-logging 和A1 / A2正常工作。所以在语法上我还可以。但是,如果我走到父POM并尝试构建整个项目,则会失败,并以 Module_A 抱怨项目相互依赖项的 dependencies.dependency.version 。当我直接调用 Module_A / pom.xml 而不是通过父POM调用 Module_A 文件夹时,这些文件确实有效。即使我尝试通过 -pl Module_A 从父文件夹仅执行 Module_A / pom.xml ,它也会失败。因此,通过父 POM.xml 文件运行Maven会破坏 Module_A / POM.xml 。
这意味着您不能在项目的两个级别上使用 dependencyManagement ,尽管我找不到任何告诉我不要这样做的东西。如果是这种情况,我似乎有两种选择:
A)将我的项目内部相互依赖性上移到父 POM.xml 。如果这样做,感觉就像我在顶部完全指定了我的所有依赖关系,而我的父级POM变得混乱不堪,过度指定了我的项目。
B)从 Module_A 中删除 dependencyManagement 标记并直接指定模块,但是随后我将所有已声明的模块包括在叶子POM中( Module_A1 < / em>等),这不是我想要的。 (我知道这个人很糟糕)
我意识到 dependencyManagement 实际上只是一系列变量声明,因此,如果我将内部依赖关系移到父POM上,则可能不会受到任何伤害,但这感觉很草率。就像我不太了解该如何按子系统将我的模块依赖项干净地隔离开来,并将它们全部都推送到最顶层的POM上一样。
我知道有些项目比我的还要复杂。我所看到的只是将数百个依赖项转储到了父POM中,从而造成了丑陋的混乱。就我而言,我将在父POM中定义我的78个叶子模块中的大多数,这感觉是错误的方法。有没有更好的方法,或者这是父POM的目的吗?要指定有关环境的所有内容,并让所有下部模块定义得尽可能少?