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