Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Maven 依赖关系管理和范围_Maven_Dependency Management - Fatal编程技术网

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>
....