Maven中依赖管理和依赖之间的差异
Maven中依赖管理和依赖之间的差异,maven,pom.xml,dependency-management,Maven,Pom.xml,Dependency Management,dependencyManagement和Dependency之间有什么区别? 我在ApacheMaven网站上看到了这些文档。 在dependencyManagement下定义的依赖项似乎可以在其子模块中使用,而无需指定版本 例如: 父项目(Pro par)在依赖项管理下定义依赖项: <dependencyManagement> <dependencies> <dependency> <groupId>junit</
dependencyManagement
和Dependency
之间有什么区别?
我在ApacheMaven网站上看到了这些文档。
在dependencyManagement
下定义的依赖项似乎可以在其子模块中使用,而无需指定版本
例如:
父项目(Pro par)在依赖项管理
下定义依赖项:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8</version>
</dependency>
</dependencies>
</dependencyManagement>
朱尼特
朱尼特
3.8
然后在Pro par的子级中,我可以使用junit:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
朱尼特
朱尼特
但是,我想知道是否有必要在父pom中定义junit?为什么不直接在需要的模块中定义它呢?正如您所说
dependencyManagement
用于将所有依赖项信息拉入公共POM文件,从而简化子POM文件中的引用
当您在多个子项目下有多个不想重新键入的属性时,它会变得非常有用
最后,dependencyManagement
可用于定义要在多个项目中使用的工件的标准版本。允许整合和集中对依赖版本的管理,而无需添加所有子项继承的依赖项。当您有一组继承公共父项的项目(即多个)时,这尤其有用
dependencyManagement
的另一个极其重要的用例是控制可传递依赖项中使用的工件的版本。这是很难解释没有一个例子。幸运的是,文档中对此进行了说明。在Eclipse中,dependencyManagement中还有一个特性。如果使用dependencies
而不使用它,则会在pom文件中注意到未找到的依赖项。如果使用了dependencyManagement
,pom文件中将不会注意到未解决的依赖项,并且错误只会出现在java文件中。(导入等…如果依赖项是在顶级pom的dependencyManagement元素中定义的,则子项目不必显式列出依赖项的版本。如果子项目确实定义了一个版本,那么它将覆盖顶级项目中列出的版本
POM的从属管理部分。也就是说,DependencyManager版本仅为
当孩子不直接声明版本时使用。Maven站点上的版本非常糟糕。DependencyManager只需将依赖项定义(版本、排除项等)上移到父pom,然后在子pom中只需放置groupId和artifactId。就是这样(除了父pom链接等,但这也不是很复杂——依赖管理在父级胜过依赖关系——但是如果对此或导入有疑问,Maven文档会更好一些)
在阅读了Maven站点上所有的“a”、“b”、“c”垃圾并感到困惑之后,我重新编写了他们的示例。因此,如果有两个项目(proj1和proj2)共享一个公共依赖项(betaShared),那么可以将该依赖项向上移动到父pom。当您进行此操作时,您还可以向上移动任何其他依赖项(alpha和charlie),但前提是它对您的项目有意义。因此,对于前面几句话中概述的情况,以下是父pom中dependencyManagement的解决方案:
阿尔法
阿尔法
1
斑马
斑马
查理
查理
1
战争
运行时
分享
分享
1
酒吧
运行时
阿尔法
阿尔法
分享
分享
酒吧
查理
查理
战争
分享
分享
酒吧
我对这个问题的回答很晚,但我认为这比公认的回答更清楚(这是正确的,但没有强调实际的重要部分,你需要自己推断)
在父POM中,
和
之间的主要区别是:
- 在
部分中指定的工件将始终作为子模块的依赖项包含
- 只有在子模块本身的
部分中也指定了在部分中指定的工件,才会将其包含在子模块中。你问为什么好?因为您在父级中指定了版本和/或范围,并且在子POM中指定依赖项时可以忽略它们。这可以帮助您对子模块的依赖项使用统一版本,而无需在每个子模块中指定版本
有一些答案概括了带有maven的
和
标签之间的区别
然而,下文以简洁的方式阐述了几点:
允许整合跨不同模块使用的所有依赖项(在子pom级别使用)清晰性,集中依赖项版本管理
允许根据需要轻松升级/降级依赖项,在其他场景中,这需要在每个子pom级别上执行--一致性
始终导入
标记中提供的依赖项,而仅当子pom的
标记中有相应的条目时,才会导入父pom中
中提供的依赖项
在我看来,还有一件事没有得到足够的强调,那就是不想要的继承
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>19.0</version>
</dependency>
</dependencies>
<modules>
<module>app</module>
<module>data</module>
</modules>
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>19.0</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
</dependencies>
<dependencies>
</dependencies>
Scanning for projects...
------------------------------------------------------------------------
Reactor Build Order:
MyProject
app
data
------------------------------------------------------------------------
Building MyProject 1.0-SNAPSHOT
------------------------------------------------------------------------
--- maven-dependency-plugin:2.8:tree (default-cli) @ MyProject ---
com.iamvickyav:MyProject:pom:1.0-SNAPSHOT
\- com.google.guava:guava:jar:19.0:compile
------------------------------------------------------------------------
Building app 1.0-SNAPSHOT
------------------------------------------------------------------------
--- maven-dependency-plugin:2.8:tree (default-cli) @ app ---
com.iamvickyav:app:jar:1.0-SNAPSHOT
\- com.google.guava:guava:jar:19.0:compile
------------------------------------------------------------------------
Building data 1.0-SNAPSHOT
------------------------------------------------------------------------
--- maven-dependency-plugin:2.8:tree (default-cli) @ data ---
com.iamvickyav:data:jar:1.0-SNAPSHOT
+- org.apache.commons:commons-lang3:jar:3.9:compile
\- com.google.guava:guava:jar:19.0:compile