如果它们来自父级的其他子模块,我是否应该依赖Maven中的传递依赖项?

皮特·穆勒

假设我们正在研究抵押子模块,并且直接Google Guava在模块代码中使用这些类,但是的依赖关系guava是在同一父对象下的其他子模块中定义的,并且我们只能通过对“投资”模块:

banking-system (parent pom.xml)
|
|-- investment (pom.xml defines <dependency>guava</dependency>)
|
|-- mortgage (pom.xml defiens <dependency>investment</dependency>)

我们是否还应该<dependency>抵押pom.xml中向Guava添加一个

缺点看起来像我们pom.xml中的副本,优点是:如果开发“投资”的人会丢弃番石榴,那么它不会阻止我们的抵押子模块成功构建。

如果是,那么<version>我们指定什么方法?<dependencyManagement>在父pom中没有+ ?)

如果是,那么我们应该<provided>在某个模块中使用范围吗?

注意:请记住,我是在特定情况下询问模块具有共同的父pom(例如,作为一个整体的应用程序)。

想象一下,也许这种结构不是最好的例子:

banking-app
    banking-core (dep.on: guava, commons, spring)
    investment (dep.on: banking-core)
    mortgage (dep.on: banking-core)

Investment使用Spring时仍应显式声明Spring @Component,如果使用Guava则声明Guava LoadedCache

皮埃尔·B。

我们直接在模块代码中使用Google Guava类,但是番石榴的依赖关系是在同一父项下的其他子模块中定义的,我们只能通过对“投资”模块的传递依赖来访问Guava类[...]我们是否仍应在抵押pom.xml中向Guava添加一个?

是的,您应该在模块中声明Google Guava依赖项,并且不要期望它可以作为传递依赖项使用。即使它与当前版本兼容,在更高版本的直接依赖项中也可能不再如此。

如果您的代码依赖于模块,则您的代码应仅直接依赖于此模块的类,而不应依赖于此模块的传递依赖。如您所述,不能保证投资模块将来将继续依赖Guava。您需要在父级的pom.xml或模块本身中指定此依赖关系,以确保在不依赖传递依赖关系的情况下将其可用。它不是重复的,您还能如何告诉Maven您的模块取决于Guava?

我看不到在任何情况下都需要遵守最低限度的最佳实践的情况。

如果是,那么<version>我们指定什么方法?<dependencyManagement>在父pom中没有+ ?)

是的,最好<dependencyManagement>在父<dependency>版本中使用,而在子版本中使用不带版本的子模块是最好的:您将确保所有模块都使用相同版本的依赖。由于您的模块是一个整体应用程序,因此它可能会更好,因为它将避免各种问题,例如在类路径上存在相同依赖项的不同版本,从而造成混乱。

即使出于某种原因,您的使用同一父级的模块之一需要我们依赖关系的不同版本,仍然可以使用来覆盖此特定模块的版本<version>

如果是,那么我们应该在某个模块中使用范围吗?

可能不是,具有compile范围的依赖性是大多数包装方法中最好的选择。

但是,在某些情况下,您可能需要或希望这样做,例如,如果所述模块需要使用运行时环境特定的版本,或者您的部署或打包模型是按要求的方式设计的。考虑到您暴露的情况,尽管大​​多数情况下都没有必要,但两者都是可能的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我应该将软件包依赖项传递给模块函数还是仅在模块文件中要求它们?

我的Maven模块无法在其他Maven模块中找到类,尽管我将其设置为依赖项

Julia中的子模块内部依赖项

我应该在CocoaPods依赖项中添加Foundation和其他标准框架吗?

Maven多模块:子模块作为依赖项

在build.sbt中,父项目中的依赖项未反映在子模块中

Scala“未找到:对象com”-如果没有其他依赖项,我真的应该在build.sbt中添加条目吗?

我无法使用Maven在子模块中使用继承的依赖项

我怎样才能使GitHub依赖图/ Maven子模块上的指标列表依赖项所使用?

如何从Python中的子模块安装依赖项?

在gradle中,我可以编译本地模块并将其用作其他“外部”库的依赖项吗?

在Maven 2中,我怎么知道传递依赖来自哪个依赖?

Maven-父级和导入范围中的依赖项管理

Maven中的传递依赖项的替代版本

如何排除来自POM文件中父项的依赖项

Gradle 多模块项目编译失败,来自子模块中提到的依赖项的“classNotFoundExceptions”

pytest是否应该从虚拟环境中的依赖项模块收集测试?

是否应该从__dir__方法隐藏python模块中的依赖项导入?

基本的 maven 问题:maven 是否可以传递安装依赖项?

我是否应该可靠地依赖其他合同的要求声明?

我应该在mean.js中添加模块依赖项(对于ng-sortable)

来自Maven BOM的传递依赖?

在flutter中使用import'dart:html'-我是否需要其他依赖项?

什么是传递Maven依赖项?

Maven安装传递依赖项

Maven父层次+依赖关系管理是否可传递?

我应该如何更新完全依赖其他资源的资源

仅我自己的模块之间的 Maven 依赖项

没有多模块的Maven中是否存在“使用本地依赖项进行构建”?