dependencyManagement只是插件管理,并不是真正的插件依赖,所以里面包含的插件在没有子项目使用的时候,并不会真正下载

1 .使用项目继承

利用项目继承可以将结构信息,部署信息,共同的依赖信息放置在单一的位置。在每个工程的 pom 中:

  1. <parent>
  2. <groupId>org.apache.maven.proficio</groupId>
  3. <artifactId>proficio</artifactId>
  4. <version>1.0-SNAPSHOT</version>
  5. </parent>

这使得项目的 pom 可以继承顶层 pom 中的定义,检查顶层 pom 的 dependencies 部分:

  1. <project>
  2. <dependencies >
  3. <dependency >
  4. <groupId>junit</groupId>
  5. <artifactId>junit</artifactId>
  6. <version>4.7</version>
  7. <scope>test</scope>
  8. </dependency >
  9. </dependencies >
  10. </project>

在各个子模块的 pom 中没有对 Junit 依赖的定义,但是从顶层 pom 中继承了依赖的定义。

为了看清楚可以在一个子模块 pom 所在目录下,执行命令

  1. #mvn help:effective-pom

可以看到最终起效果的 pom ,这在找错时很有效。

2 .管理依赖

在 pom 中指明 dependency management 元素的方式 maven 结合项目继承来管理依赖。在多模块应用中,可能多个子项目会有共同的依赖。此时为了正确运行,必须让所有的子项目使用依赖项的同一版本。必须确保应用的各个项目的依赖项和版本一致,才能保证测试的和发布的是相同的成果。因此,应在顶层的 pom 中定义共同的依赖关系。

在 Proficio 应用的顶层 pom 中的 dependency management 段如下:

  1. <dependencyManagement>
  2. <dependencies >
  3. <dependency >
  4. <groupId>com.devzuz.mvnbook.proficio</groupId>
  5. <artifactId>proficio-model</artifactId>
  6. <c>${project.version}</version>
  7. </dependency >
  8. <dependency >
  9. <groupId>com.devzuz.mvnbook.proficio</groupId>
  10. <artifactId>proficio-api</artifactId>
  11. <version>${project.version}</version>
  12. </dependency >
  13. <dependency >
  14. <groupId>com.devzuz.mvnbook.proficio</groupId>
  15. <artifactId>proficio-core</artifactId>
  16. <version>${project.version}</version>
  17. </dependency >
  18. <dependency >
  19. <groupId>com.devzuz.mvnbook.proficio</groupId>
  20. <artifactId>proficio-store-memory</artifactId>
  21. <version>${project.version}</version>
  22. </dependency >
  23. <dependency >
  24. <groupId>com.devzuz.mvnbook.proficio</groupId>
  25. <artifactId>proficio-store-xstream</artifactId>
  26. <version>${project.version}</version>
  27. </dependency >
  28. <dependency >
  29. <groupId>org.codehaus.plexus</groupId>
  30. <artifactId>plexus-container-default</artifactId>
  31. <version>1.0-alpha-9</version>
  32. </dependency >
  33. </dependencies >
  34. </dependencyManagement>

注意 ${project.version} 变量指的是应用的 version 。

顶层 pom 中的 dependencies 与 dependencyManagement 中的 dependencies 元素有一个重要的区别:

dependencyManagement 中的 dependencies 元素只表明依赖项版本的优先选择,并不影响项目的依赖项;而 dependencies 元素则影响项目的依赖项。

检查 Proficio api 模块的 pom:

  1. <project>
  2. <parent>
  3. <groupId>com.devzuz.mvnbook.proficio</groupId>
  4. <artifactId>proficio</artifactId>
  5. <version>1.0-SNAPSHOT</version>
  6. </parent>
  7. <modelVersion>4.0.0</modelVersion>
  8. <artifactId>proficio-api</artifactId>
  9. <packaging>jar</packaging>
  10. <name>Proficio API</name>
  11. <dependencies >
  12. <dependency >
  13. <groupId>com.devzuz.mvnbook.proficio</groupId>
  14. <artifactId>proficio-model</artifactId>
  15. </dependency >
  16. </dependencies >
  17. </project>

其中没有指明依赖项的版本信息,在顶层 pom 中的 dependencyManagement 中表明其优选的版本是 ${project.version} 即 1.0-SNAPSHOT 。为使其模块 pom 完整,其版本信息会注入其中。

只有当 外层的dependencies 元素中没有指明版本信息时, dependencyManagement 中的 dependencies 元素才起作用。

注意:一个是项目依赖,一个是多模块maven项目时候的依赖管理控制的。

Maven中<dependencies>节点和<dependencyManagement>节点的区别的更多相关文章

  1. Maven中<dependencies>节点和<dependencyManagement>节点的区别 转

    以前一直没有在意,今天建立maven工程的时候在<dependencyManagement>节点下加入了junit依赖,结果在dependency Graph中没有发现junit的依赖关系 ...

  2. 【完美解决】IDEA 中 Maven 报错 Cannot resolve xxx 和 Maven 中 Dependencies 报红/报错。

    目录 前提 场景 解决办法 1.首先,清除缓存,点击之后重启IDEA. 2.关闭IDEA,打开项目文件夹 3.重新打开 IDEA,找到右边的 Maven 4.解决 Maven 中 Dependenci ...

  3. maven 中snapshot版本和release版本的区别

    maven中的仓库分为两种,snapshot快照仓库和release发布仓库.snapshot快照仓库用于保存开发过程中的不稳定版本,release正式仓库则是用来保存稳定的发行版本.定义一个组件/模 ...

  4. Maven中dependencies和dependencyManagement的区别

    Maven项目中,为了保持引用依赖的一致性,一般会抽出一个parent层,用来管理子项目的maven依赖,对于依赖的管理有两种方式,分别是dependencies以及dependencyManagem ...

  5. 二、Spring Boot 中maven中dependencies所有的jar包都报红,install报错(https://repo.maven.apache.org/maven2): Not authorized , ReasonPhrase:Authorizatio

    问题一:现象:打开SpringBoot项目后,所有依赖包都报红色波浪线 1.install报错(https://repo.maven.apache.org/maven2): Not authorize ...

  6. maven中jar、war、pom的区别

    一.maven的三种packaging方式 pom是maven依赖文件 jar是java普通项目打包 war是java web项目打包 pom:打出来可以作为其他项目的maven依赖,在工程A中添加工 ...

  7. Maven中的SnapShot版本和Release版本

    # Maven中的SnapShot版本和Release版本 ## 区别 - SnapShot 快照版本- Release 发布版本 ## 重要区别 - 本地获取这些依赖的机制不同,如果是快照版本,Ma ...

  8. maven 中的pom中的 dependencyManagement 和 dependencies

    参考:maven pom.xml 中 dependencyManagement和dependencies详解 现在的项目基本上都是使用多module来管理的,这就涉及到一个问题,多module之间如何 ...

  9. 034 Maven中的dependencyManagement和dependencies区别

    这个标签使用过,但是具体的描述还是没有说明过.在这里,专门查了一下,写了这篇文章. 1.定义 在Maven中dependencyManagement的作用其实相当于一个对所依赖jar包进行版本管理的管 ...

随机推荐

  1. js获取光标位置并插入内容

    先来几个网上找的参考资源,我爱互联网,互联网使我变得更加强大. https://blog.csdn.net/mafan121/article/details/78519348 详细篇,该作者很用心的解 ...

  2. hdu 5936 2016ccpc 杭州 - D

    数学题好难啊!!!! 最长长度不超过十位, 折半枚举... 题解 #include<bits/stdc++.h> #define LL long long #define fi first ...

  3. 全文搜索引擎 Elasticsearch (一)

    一.安装 Elastic 需要 Java 8 环境.如果你的机器还没安装 Java,可以参考这篇文章,注意要保证环境变量JAVA_HOME正确设置. 安装完 Java,就可以跟着官方文档安装 Elas ...

  4. C#.net实现图片上传功能

    C#.NET前台:<asp:Image ID="imgFood" runat="server" /> <asp:FileUpload ID=& ...

  5. ubuntu 安装 theano

    参考博客: http://www.cnblogs.com/anyview/p/5025704.html 1. 安装gfortran, numpy, scipy, sklearn, blas, atla ...

  6. thinphp中volist嵌套循环时变量$i 被污染问题,key="k"

    默认是$i,但是嵌套循环是使用$i,默认的变量$i就会被污染.可以自定义设置变量key="k" k任意. 用 key="k" 代替默认的 $i 1 2 3 4 ...

  7. 牛客网 桂林电子科技大学第三届ACM程序设计竞赛 C.二元-K个二元组最小值和最大-优先队列+贪心(思维)

    链接:https://ac.nowcoder.com/acm/contest/558/C来源:牛客网 小猫在研究二元组. 小猫在研究最大值. 给定N个二元组(a1,b1),(a2,b2),…,(aN, ...

  8. V-by-one

    一:v-by-one技术产生背景     LVDS已经在业界盛行多年,近来电视解析度和播放格式的进展已经导致频宽需求大幅增加,具有60Hz和120Hz甚至240Hz更新频率的电视已经在商店内 贩售.2 ...

  9. JAVA基础部分面试

    1:面向对象编程有很多重要的特性: 封装,继承,多态和抽象. 2:什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? (1)Java虚拟机是一个可以执行Java字节码的虚拟机进程.J ...

  10. SpringMvc和servlet对比

    一.servlet实现登录. 咱们先来看一下servlet实现注册登录. <servlet> <servlet-name>LoginServlet</servlet-na ...