0

如果一个项目有很多子项目,并且所有的子项目都有一个共同的父 pom.xml,那么不应该在父 pom.xml 中列出所有依赖项吗?

允许子项目拥有自己的依赖项有什么意义..?它只是打开了一种可能性,一个子项目将使用 apache_xyzlibrary_1.0.jar 而另一个子项目可能使用 _2.0.jar ?

注意:所有 maven 子项目组合成一个 webapp WAR。

4

2 回答 2

3

将所有项目依赖项包含到每个子项目中将是非常低效的,因为这样做会有效地将不必要的依赖项引入每个子项目的构建中。另一个问题是,如果您有子项目间的依赖关系,即子项目a 依赖于子项目b,那么您可以很容易地结束一个maven 无法解决的循环依赖关系。

为了在整个项目中保持依赖版本的一致性,maven 的方法是利用项目父 pom 中的依赖管理部分。因此,只在父 pom 的依赖管理部分设置每个依赖的版本。在子项目的 pom 中,只说明了 group Id 和 artefact Id。除非需要,否则不应在子项目的 pom 中使用版本标记(即,当子项目需要与项目其余部分不同的特定版本的依赖项时)

于 2012-04-11T15:25:24.867 回答
0

如果所有子项都声明了相同的依赖项,那么最好在父项中声明该依赖项。你是对的,确保所有项目都使用一致版本的依赖项。

至于为什么 Maven 开发人员决定允许在子项目中声明依赖项,如果这样可以使用相同依赖项的不同版本?我想他们正在考虑项目中本地声明的依赖项的优势,当它们与兄弟项目不同时,比限制父项为其所有子项声明所有依赖项更好。

把它想象成在一个类的不同范围内声明的变量。如果您在一个方法中有一个私有变量,您知道它只在一个方法中使用,您可以根据需要更改它,而无需担心您的整个代码库。如果您在一个类中有一个私有字段,您必须知道它在该类中的所有用法,而不是在其他文件中。如果你有一个公共变量,那么你就明白了。依赖项是相同的,如果您为单个项目声明了一个,则可以确定它仅由单个项目使用/需要。此外,如果您正在构建同一父级的不同子项目,则不需要存在它。

至于你构建一个 WAR,你是对的,在不同的子项目中使用相同依赖项的不同版本可能会让你对最终的工件感到悲伤。请注意,在其他项目类型和构建周期中,项目之间的版本号混合可能不是问题,而是实际需要的。

还要记住,maven 父 pom 文件也可以有父文件。这允许层次结构的更多层,而不仅仅是 2 个级别。我认为如果所有子项目都必须在顶级父项目 pom 文件中声明其依赖项,那将是荒谬的。

于 2012-04-11T15:11:29.537 回答