我正在尝试确定以下情况的方法:
有3个Maven工件:A,B和C.
B取决于A.(即它使用了一些A的代码)
C取决于A和B(即它使用A的代码和B的代码)。
假设我想为B和C使用相同版本的A。
应该采用什么方法?
1)将A声明为C的pom.xml中的依赖项。
亲:开发人员清楚C取决于A. Con:如果A的版本发生变化,则需要在多个位置进行更新。 (B和C)
2)不要将A声明为C的pom.xml中的依赖项。
Pro / Con:与选项1相反。
答案 0 :(得分:4)
我认为你应该在你的pom中声明所有直接依赖项。传递依赖只是自动解决依赖关系的一种便利。
如果更改直接依赖项的版本,则传递依赖项可能会随之更改,从而可能会破坏模块。该模块应该构建为一个独立的单元,因此应该具有良好定义的依赖关系,这些依赖关系不会因外部更改而中断。
我不同意这违反了DRY原则,因为maven在单个项目及其pom的范围内定义了事物。在这个范围内没有重复。
<强>更新强> 对现有传递依赖性的依赖使得项目本身很脆弱,并且还可能导致更复杂的问题,例如何时包含它。
例如,如果C对A具有编译依赖性,但对B具有运行时依赖性,那么您现在必须添加依赖项(因为它不再位于构建路径中)或将B声明为编译,即使它不是。为清楚起见,有很多话要说。明确定义您的依赖项是什么以及它们的范围是什么,并期望您的依赖项执行相同的操作。在大多数情况下,你的依赖是一个黑盒子,直到它导致问题,你必须打开它。
答案 1 :(得分:3)
1)将A声明为C的pom.xml中的依赖项。
依赖性是可读的
依赖性是灵活的。如果你想从B中删除A的依赖关系,你不需要考虑依赖于B的项目。
如other answer所述,写下来是一个好习惯在pom.xml中直接依赖,让maven处理它。
2)不要将A声明为C的pom.xml中的依赖项。
通常,没有开发人员会看到pom.xml。如果他们希望他们可以通过使用
mvn dependency:tree
来看到它,它将显示传递依赖性。
当发布新版本的A时,会有单点变化。如果您在多个地方定义依赖项,则可能会忘记更新所有位置。在这种情况下,Maven会自动使用最新版本。但是,它有时会刺痛。
有些人更喜欢这个,因为这种类型的依赖主要是常识(例如MyWebApp -> MyWebAppLib -> MySharedLib
和MyWebApp -> MySharedLib
),他们希望避免在多个地方更新版本的更新步骤在每个版本上。
我写下了利弊,你应该自己评估最适合自己的东西。
编辑#1: tsk!我已经改变了我的意见 编辑#2:在对this answer进行讨论后更新了答案。