如果一个项目有很多子项目,并且所有子项目都有一个共同的父pom.xml,那么不应该在父pom.xml中列出所有的依赖项吗?
允许子项目拥有自己的依赖项是什么意思?它只是开辟了一个可能性,一个子项目将使用apache_xyzlibrary_1.0.jar而另一个子项目可能使用_2.0.jar?
注意:所有maven子项目组合在一起形成一个webapp WAR。
答案 0 :(得分:3)
将所有项目依赖项包含到每个子项目中效率非常低,因为这样做可以有效地为每个子项目的构建带来不必要的依赖关系。另一个问题是如果你有子项目依赖项,即子项目a取决于子项目b,那么你可以很容易地结束maven无法解决的循环依赖。
为了保持项目中依赖项版本的一致性,maven的方法是利用项目父pom中的依赖项管理部分。因此,仅在父pom的依赖关系管理部分中设置每个依赖项的版本。在子项目的pom中,仅声明了组ID和artefact Id。除非需要(即当子项目需要特定版本的依赖项与项目的其余部分不同时),否则不应在子项目的pom中使用版本标记
答案 1 :(得分:0)
如果所有子节点都声明了相同的依赖关系,那么最好在父节点中声明该依赖关系。你是对的,确保所有项目都使用一致的依赖版本。
至于为什么Maven开发人员决定允许在子项目中声明依赖项,如果这样可以使用相同依赖项的不同版本?我想他们正在考虑项目中本地声明的依赖项的优势,当它们与兄弟项目不同时,比限制父项为其所有子项声明所有依赖项更好。
将其想象为在类中的不同范围声明的变量。如果方法中有私有变量,您知道它只在一个方法中使用,您可以根据需要进行更改,而无需担心整个代码库。如果您在类中有私有字段,则必须知道该类中的所有用法,而不是其他文件中的用法。如果你有一个公共变量,那么你就明白了。依赖关系是相同的,如果您为一个项目声明了一个,您可以确定它仅由单个项目使用/需要。此外,如果要构建同一父项的不同子项目,则不需要存在。
至于构建WAR,你是对的,在不同的子项目中使用相同依赖项的不同版本可能会让你对最终的工件感到悲伤。请注意,还有其他项目类型和构建周期,项目之间的混合版本号可能不是问题,实际上是期望的。
还要记住,maven父pom文件也可以有父母。这允许更多层级而不仅仅是2个级别。我认为如果所有子项目都必须在顶级父项目pom文件中声明其依赖项,那将是荒谬的。