【问题标题】:maven sub projects - should they have their own depedenciesmaven 子项目 - 他们应该有自己的依赖关系
【发布时间】:2012-04-11 14:39:12
【问题描述】:

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

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

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

【问题讨论】:

    标签: maven maven-2


    【解决方案1】:

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

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

    【讨论】:

    • 如果这种安排是一个标准的做法会很好,其中,父pom有完整的依赖定义(即包括版本号),而子项目只是“列出”依赖,允许父母指定版本。
    • 我同意如果这种做法得到更多鼓励会很好,但我认为说应该强制执行可能有点过头了。 Maven 经常提供许多不同的方法来完成任何事情。我确实认为,如果多个项目引用同一依赖项的不同版本,则构建会显示警告,因此如果您正在做一些可能不好的事情,它就会出现在您面前。
    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 我不太同意变量范围的类比。所以不是一回事。我认为依赖项应该列在“那场战争的父 pom”中。 (或“耳朵” .. 无论神器是什么)。你怎么看?
    • @rk2010 - 我认为您应该将 maven 依赖项视为变量范围;您可以使用范围轻松确定与任何给定变量相关的代码级别,并且如果您想保证两个事物使用相同的值,则它们需要引用相同的变量,而不是两次声明它并允许它们可能会失去同步。至于“我认为依赖关系应该是那场战争的父 pom 中列出的。”,这就是我理解你发布的原始问题要问的问题。我的回答解释了我的想法。
    猜你喜欢
    • 2023-03-13
    • 2012-03-12
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 2016-01-13
    • 1970-01-01
    • 2014-09-05
    相关资源
    最近更新 更多