Maven:你如何处理直接和传递的依赖?

时间:2011-01-11 20:00:43

标签: java maven-2

我正在尝试确定以下情况的方法:

有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相反。

2 个答案:

答案 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 -> MySharedLibMyWebApp -> MySharedLib),他们希望避免在多个地方更新版本的更新步骤在每个版本上。

我写下了利弊,你应该自己评估最适合自己的东西。


编辑#1: tsk!我已经改变了我的意见 编辑#2:在对this answer进行讨论后更新了答案。