如果它们来自父模块的其他子模块,我是否应该依赖Maven中的可传递依赖项?
假设我们正在处理抵押子模块,并且我们直接使用模块代码中的如果它们来自父模块的其他子模块,我是否应该依赖Maven中的可传递依赖项?,maven,dependencies,pom.xml,parent-pom,transitive-dependency,Maven,Dependencies,Pom.xml,Parent Pom,Transitive Dependency,假设我们正在处理抵押子模块,并且我们直接使用模块代码中的谷歌番石榴类,但是番石榴的依赖关系在同一父模块下的其他子模块中定义,我们只能通过对“投资”模块的传递依赖来访问番石榴类: 当使用@Component时,仍然应该Investment显式声明Spring,如果使用Guava的LoadedCache?当模块使用第三方库时,该模块也应该显式依赖其pom.xml中的库。想象一下,如果另一个项目应该使用“抵押”模块,并且不依赖于Guava,它将失败,例如,当单元测试遇到涉及Guava的代码路径时。一个
谷歌番石榴
类,但是番石榴
的依赖关系在同一父模块下的其他子模块中定义,我们只能通过对“投资”模块的传递依赖来访问番石榴类:
当使用
@Component
时,仍然应该Investment
显式声明Spring,如果使用Guava的LoadedCache
?当模块使用第三方库时,该模块也应该显式依赖其pom.xml中的库。想象一下,如果另一个项目应该使用“抵押”模块,并且不依赖于Guava,它将失败,例如,当单元测试遇到涉及Guava的代码路径时。一个显式的依赖关系还可以让您避免重构“投资”模块,使其不再使用Guava。您的“投资”模块应该对其依赖项中的此类更改不敏感
明确列出直接依赖项总是正确的。说到版本,最好将其保留在父pom的dependencyManagement
部分,以便所有子项目都继承该(相同)版本
- 投资(取决于番石榴范围:=提供的)
- 抵押贷款(取决于投资,但不需要番石榴本身)
)
是,在父模块中使用
,在没有版本的子模块中使用
是最好的:您将确保所有模块使用相同版本的依赖项。由于您的模块作为一个整体是一个应用程序,它可能会更好,因为它将避免各种问题,例如在类路径上存在同一依赖项的不同版本,从而造成严重破坏
即使出于某种原因,使用同一父模块的某个模块需要不同版本的依赖项,仍然可以使用
覆盖此特定模块的版本
如果是,那么我们是否应该在某些模块中使用范围
可能不,拥有编译
范围的依赖关系是大多数打包方法的最佳选择
但是在某些情况下,您可能需要或更愿意这样做,例如,如果所述模块需要使用运行时环境特定的版本,或者如果您的部署或打包模型是按要求设计的。考虑到您所暴露的情况,这两种情况都是可能的,尽管大多数情况下这是不必要的 我会复制并让家长中的dependencyManagement负责版本。可能会复制,但请记住,
抵押贷款
模块明确要求投资
模块,因此当有人依赖抵押贷款
“ony”,无论如何,它都会利用guava alsoExplicit吸引投资
,对于模块中使用的所有代码来说,依赖关系仍然是一条必经之路。我用另一个例子更新了我的答案。
banking-system (parent pom.xml)
|
|-- investment (pom.xml defines <dependency>guava</dependency>)
|
|-- mortgage (pom.xml defiens <dependency>investment</dependency>)
banking-app
banking-core (dep.on: guava, commons, spring)
investment (dep.on: banking-core)
mortgage (dep.on: banking-core)