您是不是应该在您的 pom 中包含那些已经是您的某些依赖项的依赖项的依赖项?

Posted

技术标签:

【中文标题】您是不是应该在您的 pom 中包含那些已经是您的某些依赖项的依赖项的依赖项?【英文标题】:Should you include those dependencies in your pom that are already the dependencies of some of your dependencies?您是否应该在您的 pom 中包含那些已经是您的某些依赖项的依赖项的依赖项? 【发布时间】:2019-04-11 12:09:16 【问题描述】:

假设您需要两个依赖项:A 和 B。同时 A 已经是 B 的依赖项。那么您是否仍然希望/需要在 pom 中添加 A 和 B 作为依赖项?

我相信当 A 和 B 是外部库时,可能需要这样做,其中 A 所需的版本可能与 B 所依赖的 A 版本不同。

但是当你的模块和 A 和 B 都是同一个项目中的模块时呢?即知道他们的版本都将同步。

【问题讨论】:

【参考方案1】:

如果您的模块使用来自 B 的 API,最好将其显式添加到您的 pom 中,即使这不是绝对必要的。如果您升级 A,很可能它不再使用 B,然后您将在不更改模块代码的情况下构建失败。

关于版本,您应该在父 pom.xml 中管理带有dependencyManagement 的版本。然后,您可以跳过子 pom 中托管依赖项的版本。 dependencyManagement 中的版本会覆盖传递依赖项中的版本,确保您在任何地方都使用相同的版本。

如果所有模块都在同一个项目中,它们也应该共享相同的项目版本。通常,这将是快照版本,例如1-SNAPSHOT

每个模块都会使用类似的东西:

<project>
  <artifactId>A</artifactId>
  <version>1-SNAPSHOT</version>

并在其他模块中像这样引用A和B:

<dependency>
  <groupId>com.yourcompany</groupId>
  <artifactId>A</artifactId>
  <version>$project.version</version>
</dependency>

要在构建版本之前设置非 SNAPSHOT 版本,例如,您可以使用 maven-dependency-plugin 的 versions:set 目标。

【讨论】:

谢谢。所以你的意思是即使在同一个项目中使用模块时,我们仍然包含所有必需的依赖项,知道一些已经包含在其他依赖项中? 是的,否则构建将容易受到其他模块依赖项更改的影响。如您的示例所示,如果 A 不再需要 B,但您的模块仍然需要 A 和 B。如果有很多依赖项,并且您发现自己一遍又一遍地需要相同的集合,则可以创建一个纯 pom 模块(让我们称它为“common-deps”)来定义该集合并让您将其维护在一个地方。然后,您可以将“common-deps”作为依赖项添加到依赖 pom 而不是整个集合。这是我们项目中的一个示例模块:github.com/vespa-engine/vespa/tree/master/….

以上是关于您是不是应该在您的 pom 中包含那些已经是您的某些依赖项的依赖项的依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

在您的 html 中包含大量脚本标签是不是存在任何性能问题?

iOS 文档文件夹中包含文件的应用程序大小

如何在您的 Ionic / AngularJs 应用程序中包含和使用节点模块?

您对在您的页面中包含 ie7.js 或 ie8.js 感觉如何?

Angular 4 - 请在您的应用程序中包含“BrowserAnimationsModule”或“NoopAnimationsModule”

业力测试:合成属性@transitionMessages。请在您的应用程序中包含“BrowserAnimationsModule”或“NoopAnimationsModule”