Maven 依赖关系管理和范围
我通常在Maven 依赖关系管理和范围,maven,dependency-management,Maven,Dependency Management,我通常在父项目/pom.xml中放一个部分。此部分包含我的子模块的所有依赖项的声明和版本,如下所示(即没有元素): 朱尼特 朱尼特 4.10 在所有子模块(即moduleX/pom.xml)中,我有: <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <sc
父项目/pom.xml
中放一个
部分。此
部分包含我的子模块的所有依赖项的声明和版本,如下所示(即没有
元素):
朱尼特
朱尼特
4.10
在所有子模块(即moduleX/pom.xml)中,我有:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
朱尼特
朱尼特
测试
显然,在这个例子中,我对同一个依赖项重复了多次测试
(在每个需要junit的子模块中重复一次)
我的问题是:关于
声明的最佳实践是什么?把它放在
中更好吗?还是最好把它放在子模块的
部分(如本文所述)?为什么呢?这个问题有明确的答案吗 对于任何范围,向依赖项管理添加单个依赖项都没有好处。你所拥有的只是复制品。如果要配置版本,请添加属性并在依赖项中使用它:
<properties>
<junit.version>4.10</junit.version>
...
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
</dependencies>
dependencyManagement
仅用于定义所有项目子模块的依赖项版本,本节中唯一相关的范围是bom的import
范围必须在依赖项
部分中定义
(对于给定的依赖项,它决定了使用上下文。它只允许在需要执行依赖项时才包含该依赖项。例如,ear将不会与Java ee依赖项打包(提供的范围
),因为它将在目标服务器上找到它们。)
[编辑]
第一条语句有一个例外,在
dependency管理
部分中提供的作用域将覆盖dependency
部分中定义的作用域。请看,聚会有点晚了,但我要加上我的两分钱
我最近遇到了一个很难调试的问题。
我有一个用于管理多个项目之间依赖关系的父pom。我将它与它们之间常见的所有依赖项一起设置,包括groupId
,artifactId
,version
和最常见的范围
我的想法是,如果范围与最常见的范围一致,我就不必在每个项目的实际依赖项部分包含范围
当其中一些依赖项显示为可传递依赖项时,就会出现问题。例如,如果:
- A在编译范围依赖于B
- B在编译范围内依赖于C
- C设置为在父级的
dependencyManagement
中提供
然后确定提供A对C的可传递依赖关系。我不确定这是否有意义,但这确实令人困惑
无论如何,省去你的麻烦,把范围
从你的依赖关系管理中排除出来
与其他答案一样,最佳做法是从依赖关系管理中排除范围,并在定义依赖关系时显式指定它。极少数情况下,您希望在不同的范围内使用同一依赖关系的不同版本,例如。,编译应用程序时使用一个版本,运行应用程序时使用另一个版本——我能想到的唯一情况是,如果用户使用的是库的另一个版本,而不是您指定的版本,您希望显式地对库的另一个版本运行测试
如果您在DependencyManager中定义了作用域,那么它会将该版本的使用限制为仅使用已定义的作用域,因此任何其他作用域都会选择该依赖项的随机版本。昨天我们在DependencyManager中定义了junit 4.12和测试范围,但我们的通用测试框架模块使用了junit和编译范围,因此它选择了版本4.8.2。“本节中唯一相关的范围是导入”这是否意味着如果我将作用域测试
放在dependencyManagement
中:它没有效果?事实上,我似乎不是完全正确。cf.dependencyManagement
作用域有兴趣dependencyManagement(即使只有一个依赖项)是定义工件版本的唯一位置。在我看来,这一事实足以使用它。使用属性是很有用的,因为您有多个工件总是带有相同的versionId(例如spring模块)使用dependencyManagement的另一个原因是集中排除依赖项的不需要的可传递依赖项。使用版本属性的另一个原因是,您可以使用mvn versions:display property updates
——快速检查依赖项版本更新,只要您注意在artifactId.version
pattern它有道理,但没有很好的文档记录,请参见,我在下面编辑了我的答案
<properties>
<junit.version>4.10</junit.version>
...
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.jboss.bom</groupId>
<artifactId>jboss-javaee-6.0-with-tools</artifactId>
<version>${javaee6.with.tools.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
....