【maven】9、pom.xml介绍(二)

Maven inheritance

什么是Maven inheritance?

本章介绍Maven的继承功能。什么是继承?
继承在本质上是特殊一般的关系,即常说的is-a关系。子类继承父类,表明子类是一种特殊的父类,并且具有父类所不具有的一些属性或方法。
现实生活中,父子之间,儿子不仅可以自己挣钱而且以后可以继承父亲财产,两方面都有收获,多多益善。
继承在Maven也是一样,在多模块化项目结构中,子模块继承父节点项目,可以使用父节点的依赖包,减少自己再次下载,省时省力。

支持继承元素

除了Dependency还可以继承哪些恩?以下就是可以继承的元素。

groupId
version
description
url
inceptionYear
organization
licenses
developers
contributors
mailingLists
scm
issueManagement
ciManagement
properties
dependencyManagement
dependencies
repositories
pluginRepositories
build
plugin executions with matching ids
plugin configuration
etc.
reporting
profiles

不支持继承元素

当然存在某些可以继承,那么必然存在某些不能继承:

artifactId
name
prerequisites

优化子模块查找父模块效率

多模块项目中,我们在子模块pom.xml需要设置对应的 super pom是哪个

<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
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0modelVersion>

  <parent>
    <groupId>org.codehaus.mojogroupId>
    <artifactId>my-parentartifactId>
    <version>2.0version>
    <relativePath>../my-parentrelativePath>
  parent>

  <artifactId>my-projectartifactId>
project>

发现多了一个没见过的元素relativePath,字面翻译就是相对路径,有什么用处恩?
设置relativePath时,Maven从子模块pom.xml寻找其引用的父pom,会先从相对路径找起,如果相对路径指定的不存在,在从本地资源库、远程资源库查找。

创建最优子模块pom.xml

父模块的pom.xml已经存在,我们手动创建的子模块pom.xml里面关于继承部分的元素怎么才能确认都是有用的信息恩?
Maven提供了一个命令,可以为子模块创建一个最省、最优的pom.xml。

命令如下:

mvn help:effective-pom

dependencyManagement

什么是dependencyManagement?
dependencyManagement是用于在顶层pom中被用来管理依赖父模块与子模块的继承依赖包版本。
让子项目中引用一个依赖而不用显示的列出版本号。Maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用在这个dependencyManagement元素中指定的版本号。当依赖包版本升级时,只需要改动父级pom中依赖包的版本,而不需要改动子模块的依赖包版本。这是父子pom关于依赖包继承问题。

那么同级之间恩?比如项目都使用了A、B,但是A也使用了B。使用dependencyManagement时,我们可以指定A的更早版本,那么B不得不也版本变更。这样会造成B代码内部引用错乱造成问题。
那么可以使用mvn dependency:tree ,查看依赖关系,避免问题出现。

mvn dependency:tree

dependencies与dependencyManagement区别

  • dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)
  • dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。
    引用http://www.cnblogs.com/haojiahong/p/5384030.html

你可能感兴趣的:(maven)