maven 继承(parent、dependencyManagement)

提出问题

在电商项目中,目前有3个maven工程:

  • 用户系统,依赖log4j 版本1.0
  • 商铺系统,依赖log4j 版本1.2
  • 评价系统,依赖log4j 版本1.1

也就是说:属于一个大项目的多个子项目中,有共同的依赖,但是版本不同,不易于统一管理

解决问题

通过 继承 消除重复的依赖

  1. 创建一个maven父工程,打包方式是:pom
  2. 在maven子工程引用父工程。<parent>
  3. 将子工程的共同依赖 移到 父工程中,放到<dependencyManagement>标签中
  4. 子工程只声明父工程的依赖(只需要groupId、artifactId),不指定版本
  5. 子工程需要其他版本时,指定版本即可

就可以统一受父工程的依赖管理

<dependencyManagement> 作用

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

如果某个子工程需要另外一个版本号时,只需要在自己的模块dependencies中声明该版本号即可。子工程就会使用该版本号的依赖,不继承父工程的版本号。

与dependencies区别:

  1. 父工程定义在<dependencies>中的依赖,父工程会引入,子工程也会自动引入。

  2. 父工程定义在<dependencyManagement>中的依赖,只是声明依赖,并不引入。
    当子工程需要引入父工程的某个依赖时,必须引入(只需要groupId、artifactId)。
    注意:如果子工程指定了版本号,那么会使用该版本。

例子 创建父工程

pom.xml关键部分如下:

修改打包方式

父工程要将打包方式改成pom:

<groupId>org.alibaba</groupId>
<artifactId>taobao</artifactId>
<version>1.0-SNAPSHOT</version>

<!-- 打包方式修改成pom -->
<packaging>pom</packaging>

定义:dependency

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

定义:dependencyManagement,指定log4j

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.12</version>
      </dependency>
    </dependencies>
  </dependencyManagement>

注意: 定义:dependencyManagement后,父工程并没有导入log4j.jar

例子:创建子工程

pom.xml

关键部分如下:

<!-- 继承父工程 -->
  <parent>
    <groupId>org.example</groupId>
    <artifactId>parent</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!-- 以当前文件为基准,父工程的相对路径,也可以没有 -->
    <relativePath>../parent</relativePath>
  </parent>

按下图操作:

子工程会自动导入父工程声明在<dependencies>中的junit.jar

但不会导入父工程声明在<dependencyManagement >中的log4j

配置 <dependencies>

在pom.xml中粘贴下面配置:
注意:这里不指定<version>

<dependencies>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
    </dependency>
  </dependencies>

然后点击上图中的Reimpot,子工程会导入log4j.jar,如下图:

指定<version>

当子工程需要使用log4j其他版本时,指定<version>即可:

<dependencies>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.11</version>
    </dependency>
  </dependencies>

然后点击上图中的Reimpot,子工程会导入log4j-1.2.11.jar

感谢:
https://blog.csdn.net/vtopqx/article/details/79034835


原文出处:/show_1EF5fjspYTEB.html