依赖pipe理和maven中的依赖关系之间的差异
dependencyManagement
和dependencies
什么区别? 我在Apache Maven网站上看到了这个文档。 看起来,在dependencyManagement下定义的dependencyManagement
可以用在它的子模块中,而不需要指定版本。
例如:
父项目(Pro-par)在dependencyManagement下定义一个依赖dependencyManagement
:
<dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8</version> </dependency> </dependencies> </dependencyManagement>
然后在亲的孩子,我可以使用junit:
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> </dependencies>
但是,我想知道是否有必要在父pom中定义junit? 为什么不直接在需要的模块中定义?
依赖pipe理允许整合和集中依赖版本的pipe理,而不需要添加所有子节点inheritance的依赖关系。 当你有一组inheritance一个公共父项目的项目 (即多个项目 )时,这是特别有用的。
另一个非常重要的dependencyManagement
用例是控制传递依赖中使用的工件的版本。 没有一个例子,这是很难解释的。 幸运的是,这在文档中有说明。
我对这个问题迟到了,但是我觉得这个问题比接受的问题要清楚得多(这是正确的,但没有强调你需要推断的实际重要部分)。
在父POM中, <dependencies>
和<dependencyManagement>
之间的主要区别是:
在<dependencies>
部分中指定的工件总是作为子模块的依赖包含在内。
如果在子模块本身的<dependencies>
部分也指定了它们,则<dependencies>
部分中指定的工件将仅包含在子模块中。 你问为什么好? 因为您在父级中指定了版本和/或作用域,并且可以在指定子POM中的依赖性时将其忽略。 这可以帮助您将统一版本用于子模块的依赖项,而无需在每个子模块中指定版本。
就像你说的 dependencyManagement
用于将所有的依赖关系信息提取到一个普通的POM文件中,简化子POM文件中的引用。
当您有多个不想在多个子项目中重新input的属性时,它会变得很有用。
最后,可以使用dependencyManagement
来定义在多个项目中使用的工件的标准版本。
Maven网站上的文档非常糟糕。 什么dependencyManagement所做的只是简单地将你的依赖定义(版本,排除等)移动到父pom,然后在子poms中,你只需要放置groupId和artifactId。 就是这样(除了父类链接等,但这并不复杂 – dependencyManagement胜过父级别的依赖关系 – 但如果有关于该问题或导入的问题,Maven文档会更好一些)。
在阅读了Maven网站上所有的“a”,“b”,“c”垃圾并且感到困惑之后,我重新编写了他们的例子。 所以如果你有两个项目(proj1和proj2)共享一个共同的依赖项(betaShared),你可以把这个依赖项移动到父项目上。 当你处于这个状态时,你也可以将其他的依赖关系(alpha和charlie)向上移动,但是只有在你的项目有意义的时候才行。 因此,对于前面句子中概述的情况,下面是在父类中使用dependencyManagement的解决scheme:
<!-- ParentProj pom --> <project> <dependencyManagement> <dependencies> <dependency> <!-- not much benefit defining alpha here, as we only use in 1 child, so optional --> <groupId>alpha</groupId> <artifactId>alpha</artifactId> <version>1.0</version> <exclusions> <exclusion> <groupId>zebra</groupId> <artifactId>zebra</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>charlie</groupId> <!-- not much benefit defining charlie here, so optional --> <artifactId>charlie</artifactId> <version>1.0</version> <type>war</type> <scope>runtime</scope> </dependency> <dependency> <!-- defining betaShared here makes a lot of sense --> <groupId>betaShared</groupId> <artifactId>betaShared</artifactId> <version>1.0</version> <type>bar</type> <scope>runtime</scope> </dependency> </dependencies> </dependencyManagement> </project> <!-- Child Proj1 pom --> <project> <dependencies> <dependency> <groupId>alpha</groupId> <artifactId>alpha</artifactId> <!-- jar type IS DEFAULT, so no need to specify in child projects --> </dependency> <dependency> <groupId>betaShared</groupId> <artifactId>betaShared</artifactId> <type>bar</type> <!-- This is not a jar dependency, so we must specify type. --> </dependency> </dependencies> </project> <!-- Child Proj2 --> <project> <dependencies> <dependency> <groupId>charlie</groupId> <artifactId>charlie</artifactId> <type>war</type> <!-- This is not a jar dependency, so we must specify type. --> </dependency> <dependency> <groupId>betaShared</groupId> <artifactId>betaShared</artifactId> <type>bar</type> <!-- This is not a jar dependency, so we must specify type. --> </dependency> </dependencies> </project>
如果在顶层pom的dependencyManagement元素中定义了依赖关系,则子项目不必显式列出依赖关系的版本。 如果子项目没有定义一个版本,它将会覆盖顶层POM的dependencyManagement部分列出的版本。 也就是说,只有在子类没有直接声明版本的情况下才使用dependencyManagement版本。
使用maven的<dependencyManagement>
/ <dependencyManagement>
标记之间的区别很less。
但是,下面简要地阐述了几点:
-
<dependencyManagement>
允许合并在不同模块中使用的所有依赖项(在子级别使用) – 清晰性 , 中央依赖版本pipe理 -
<dependencyManagement>
允许根据需要轻松升级/降级依赖关系,在其他情况下需要在每个子级别执行 – 一致性 - 总是导入
<dependencies>
标签中提供的<dependencies>
,而父pom中的<dependencyManagement>
提供的<dependencyManagement>
只有在子POM具有相应条目的情况下才会导入
在Eclipse中, dependencyManagement
还有一个特性。 当没有它的dependencies
被使用的时候,在pom文件中就会注意到没有发现的依赖关系。 如果使用dependencyManagement
,未解决的依赖关系在pom文件中不被注意,错误只出现在java文件中。 (import等…)
如果你有在所有子模块中定义的JUnittesting用例,并且你正在使用STS或者eclipse,那么只要定义eclipse就会给testing用例提供错误。
你需要在父模块的标签之外添加junit的依赖关系,这样你就不会在eclipse中得到任何错误。 虽然maven仍然会编译而不具有这种标签