前沿

之前对maven的学习不系统,只是知道简单的使用方法,工作之后才对maven有了更深的学习。接下来小白会利用空闲时间,系统的学习一下maven,并且记录一下maven的学习心得,和大家分享一下。由于本人能力有限,写的博客难免会出现问题。希望大家也希望各位大佬指出问题,共同进步。

这里记录的maven使用时的parent和dependencyManagement标签的作用和dependencyManagement于dependency标签的区别。

这里通过两个场景进行说明:

场景一,有两个web项目W1、W2,一个java项目J1,依赖同一个jar包:domain.jar。如果分别在各自pom文件中引入domain.jar的依赖,那么当domain.jar的版本发生变化时,三个项目的pom文件都要改,项目中依赖越多修改越多。

此时就可以使用parent标签, 可以创建一个parent项目,打包类型为pom,parent项目中没有任何代码,只是管理多个项目之间公共的依赖。在parent项目的pom文件中定义对domain.jar的依赖,W1W2J1三个子项目中只需要定义<parent></parent>,parent标签中写上parent项目的pom坐标就可以引用到domain.jar了。

场景二,有一个springweb.jar,只有W1W2两个web项目需要,J1项目是java项目不需要,那么又要怎么去依赖?

可以在W1和W2中分别定义对springweb.jar的依赖,当springweb.jar版本变化时修改起来不方便。

解决办法是在parent项目的pom文件中使用<dependencyManagement>即公共的依赖写在parent的<dependency>中,不是全部需要的依赖写在dependencyManagement中,当版本修改之后只需要修改parent的dependencyManagement中的版本就可以了,子项目只需要引用就好了。(前提是子项目不写版本号,否则以子项目的版本为主)

1、parent标签

parent标签能够管理多个项目之间公共的依赖。通过字面意思我们很容易想到java中的继承,他和 java 中的继承相当,作用就是复用。例如场景一的例子。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><artifactId>xxxxxx</artifactId><packaging>pom</packaging><version>1.0.1-SNAPSHOT</version><description>xxxxxxx</description><parent><groupId>xxxxxp</groupId><artifactId>ip-pomxxxx-parent</artifactId><version>2.0.6-RELEASE</version></parent><name>y-core-parent</name><modules><module>e-contract-common</module></modules><properties><contract.pub.version>1.0.2-SNAPSHOT</contract.pub.version></properties>
......<dependencyManagement><dependencies><dependency><groupId>com.x x x.iuap</groupId><artifactId>x x x</artifactId><version>${cont.pub.version}</version></dependency>
<-- <properties><contract.pub.version>1.0.2-SNAPSHOT</contract.pub.version></properties>--></dependencyManagement><!--私服配置,用于发布--><distributionManagement><repository><id>ddds</id><name>Nexus Release Repository</name><url>http:maven仓库地址</url></repository></distributionManagement></project>

这个是项目的配置文件

<parent>
        <groupId>xxxxxp</groupId>
        <artifactId>iuap-pomxxxx-parent</artifactId>
        <version>2.0.6-RC1-RELEASE</version>
    </parent>

实现对依赖的版本统一控制,点进去我们会进入到该pom中,我们会发现该pom根据ucf-parent管理

     <parent><groupId>com.xx.iuap</groupId><artifactId>ucf-parent</artifactId><version>2.0.1-RELEASE</version></parent>

再点进去会发现

    <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.11.RELEASE</version></parent><groupId>com.xx.iuap</groupId><artifactId>uc-parent</artifactId><version>2.0.1-RELEASE</version><name>uc-parent</name><packaging>pom</packaging>

即,会继承springboot的依赖包,整个依赖关系如下

- 注释: 目前 父->子的依赖关系为

org.springframework.boot: spring-boot-starter-parent

-> com.xx.iuap: iuap-3rd-party(公司外开源的)

-> com.xx.iuap: iuap-2nd-party(公司内部的依赖库)

-> com.yonyou.iuap: yonyou-mdd-starter-parent  一方包(工程中各个模块之间的依赖)

二方包的管理

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.xx.up</groupId><artifactId>uc-parent</artifactId><version>2.0.1-RELEASE</version></parent><groupId>com.xx.iuap</groupId><artifactId>iuap-pom-with-ucf-parent</artifactId><version>2.0.6-RC1-RELEASE</version><name>iuap-pom-with-ucf-parent</name><packaging>pom</packaging><properties><!-- ucf组件 --><uc.version>2.0.0-RELEASE</ucf.version><uc.file.version>2.0.0-RELEASE</ucf.file.version><uc.log.version>1.0.9-RELEASE</ucf.log.version><uc.ds.version>2.0.0-RELEASE</ucf.ds.version><!--  iuap组件  --><ap.version>5.0.4-RELEASE</iuap.version><irs.version>5.2.8-RELEASE</iris.version><mwclient.version>5.2.8-RELEASE</mwclient.version><eos-spring-support.version>5.2.8-RELEASE</eos-spring-support.version><auth.sdk.version>6.0.2-RELEASE</auth.sdk.version><auth.sdk.core.version>3.5.2-RELEASE</auth.sdk.core.version><open.isv.version>1.0.0-RELEASE</open.isv.version></properties><dependencyManagement><dependencies><dependency><groupId>com.xx.iuap</groupId><artifactId>iuap-pom</artifactId><version>2.0.6-RC1-RELEASE</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><distributionManagement><repository><id>iUAP</id><name>iUAP</name><url>http://maven.yonyou.com/nexus/content/repositories/iUAP/</url></repository></distributionManagement>
</project>

三方包的管理

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.11.RELEASE</version></parent><groupId>com.yonyou.iuap</groupId><artifactId>ucf-parent</artifactId><version>2.0.1-RELEASE</version><name>ucf-parent</name><packaging>pom</packaging><properties><HikariCP.version>3.3.1</HikariCP.version><activation.version>1.1.1</activation.version><activiti.version>5.22.0</activiti.version><activemq-spring.version>5.16.0</activemq-spring.version><alipay-sdk.version>4.10.70.ALL</alipay-sdk.version><amqp-client.version>5.4.3</amqp-client.version><antisamy.version>1.5.7</antisamy.version><apache-lucene.version>3.0.1</apache-lucene.version><junit-repeat-rule.version>3.0.1</junit-repeat-rule.version>......</properties><dependencyManagement><dependencies><dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>${cglib.version}</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-access</artifactId><version>${logback.version}</version></dependency><dependency><groupId>com.github.cbismuth</groupId><artifactId>junit-repeat-rule</artifactId><version>${junit-repeat-rule.version}</version></dependency><dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-analyzers-common</artifactId><version>${apache-lucene.version}</version></dependency>......</dependencies></dependencyManagement><!-- 插件管理配置 --><build><plugins><!-- 定义JDK版本 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>${java.version}</source><target>${java.version}</target><encoding>${project.build.sourceEncoding}</encoding><showWarnings>true</showWarnings></configuration></plugin></plugins></build><distributionManagement><repository><id>iUAP</id><name>iUAP</name><url>http://maven.xxx.com/nexus/content/repositories/iUAP/</url></repository></distributionManagement>
</project>

2、dependencyManagement

使用dependencyManagement可以统一管理项目的版本号,确保应用的各个项目的依赖和版本一致,不用每个模块项目都弄一个版本号,不利于管理,当需要变更版本号的时候只需要在父类容器里更新,不需要任何一个子项目的修改;

如果某个子项目需要另外一个特殊的版本号时,只需要在自己的模块dependencies中声明一个版本号即可。子类就会使用子类声明的版本号,不继承于父类版本号。如果不声明版本号的话,会使用父类的版本号。

3、dependencyManagement与dependencies区别:

(1)Dependencies相对于dependencyManagement,所有生命在dependencies里的依赖都会自动引入,并默认被所有的子项目继承。
(2)dependencyManagement里只是声明依赖,并不自动实现引入,因此子项目需要显示的声明需要用的依赖。

1)如果不在子项目中声明依赖,是不会从父项目中继承下来的;

2)只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并。                且version和scope都读取自父pom;

3)另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。

具体的使用区别可以查看之前的场景2

maven---parent和dependencyManagement标签相关推荐

  1. Maven中dependencyManagement标签和dependencies的区别

    今天在maven的pom文件中看到了dependencyManagement标签,用法如下: <dependencyManagement><dependencies><d ...

  2. Maven parent.relativePath

    Maven parent.relativePath 默认值为../pom.xml 查找顺序:relativePath元素中的地址–本地仓库–远程仓库 设定一个空值将始终从仓库中获取,不从本地路径获取, ...

  3. Maven: maven parent.relativepath point at wrong local pom

    Maven: maven parent.relativepath point at wrong local pom 参考:https://blog.csdn.net/qwfys200/article/ ...

  4. 怎样给公司定义一份完美的maven parent pom 文件

    parent pom 定义你的项目模型,包括构建方式,项目环境,项目依赖,输出JavaDoc,发布source源码等等,怎样去编写一份parent pom,这里是一个现成的并正在某些项目中使用到的:点 ...

  5. Maven parent.relativePath 说明

    这里日记一下 关于Maven非常基础的问题: Maven parent.relativePath 的意思,很多人网上搜索 类似下面pom.xml中的问题 ,文件中的 <relativePath ...

  6. maven(3) parent用dependencyManagement控制版本没有传递给module的问题,dependencies.dependency.versionknown-version

    不管是parent还是module使用mvn clan package install均报错 The project com.website:demo-security:0.0.1 (C:\data\ ...

  7. 关于Maven中pom文件标签的详解,分别对比父工程pom文件与子工程pom文件。

    一.介绍 这里我们以若依开源框架为例,我们先讲解,父工程pom文件,之后再讲解子工程pom文件. 首先,我们先介绍若依前后端分离项目的目录结构; 一.父工程pom.文件 父工程pom文件注释:(每个标 ...

  8. maven 依赖版本管理— dependencyManagement

    在开发 spring boot 项目时,你是否遇到过,有些依赖即使不写版本号也能下载到某一版本的依赖. 比如下面这个案例 案例 pom文件 <?xml version="1.0&quo ...

  9. MAVEN dependencies与dependencyManagement的区别

    在上一个项目中遇到一些jar包冲突的问题,之后还有很多人分不清楚dependencies与dependencyManagement的区别,本篇文章将这些区别总结下来. 1.DepencyManagem ...

最新文章

  1. 垃圾回收在哪一章java_Java垃圾回收机制
  2. opencv中 当你直接把别人的程序拖进去无法运行时 解决方法
  3. win7系统登录界面出现“其他用户” (登录界面显示多个用户)
  4. Shell 变量的作用域
  5. 0116互联网新闻 | “DaDa英语”近日完成2.55亿美元D轮融资;腾讯推今年首个手游“闹闹天宫”...
  6. swi 指令能用在C语言吗,内嵌汇编指令的应用举例
  7. CVPR2014: DeepID解读
  8. 用项目案例彻底理解Spring IOC容器
  9. 网络介绍 > 网络连接 > 混合云网络
  10. 求锤得锤,你要的一致性 hash 来了! | 附代码
  11. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第4节 方法引用_3_方法引用_通过类名引用静态成员...
  12. 高数复习: 多元函数微分学及其应用
  13. 【短链接】——自己实现一个短网址服务
  14. java treemap 排序原理_Java TreeMap排序算法实例
  15. UI设计师求职中常被问到的13个面试题及答案总结
  16. P1338 末日的传说(C++_数论_递推)
  17. php中x22是什么意思,我想问一下:联想s22e和x22区别哪款好用点??真实反馈一下!!...
  18. 用python爬取百科糗事的小项目
  19. spyeye手机远程控制手机苹果免越狱封装支持扫码安装
  20. eclipse 导入jsp 乱码

热门文章

  1. CSS BFC学习笔记
  2. ROS小车——登录和简单控制(1)
  3. golang 定义二维数组的长度
  4. JavaScript内存泄漏定位
  5. python求和1到100_加一行代码,让你的Python的运算速度加快100倍
  6. 领先的PHP虚拟主机_PHP虚拟主机推荐
  7. 货拉拉 算法工程师 校招 一面面经
  8. 阿里云OSS图片上传
  9. 如何在Windows 10中调整开始菜单的大小
  10. 下载天堂图片网的所有图片和壁纸