Skip to content

模块继承

Maven 的 继承是通过 <parent> 标签来实现的。子模块(子项目)继承父 POM 的 配置、依赖管理、插件管理 等,而不一定在文件系统中是父子目录关系(虽然通常会这样做)。

声明父pom

  • 子模块:
xml
<?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.example</groupId>
        <artifactId>maven-demo</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>service</artifactId>
  
      <dependencies>
        <!-- spring-boot-starter-web 版本由父 POM 管理 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

</project>

没有relativePath标签等同<relativePath>../pom.xml</relativePath>, 即默认从当前pom文件的上一级目录找

继承的属性

子模块不需要再写版本号、插件配置或公共属性,继承父 POM 的管理能力。

xml
<project>
  <!--<groupId>com.example</groupId>-->
  <artifactId>project-root</artifactId>
  <!--<version>1.0.0</version>-->
</project>
类型说明
groupId / version / packaging父 POM 的 groupIdversionpackaging 默认继承,子模块可以覆盖 artifactId
properties所有 <properties> 都会被子模块继承,用于统一版本、路径、配置
dependencyManagement管理依赖版本,子模块声明依赖可不写版本号
dependencies父 POM 的 <dependencies> 也会被子模块继承(不建议用,推荐用 dependencyManagement)
build / pluginManagement父 POM 中插件版本、配置可继承,子模块可直接使用或覆盖
repositories / pluginRepositories父 POM 配置的仓库地址、插件仓库可继承
profiles父 POM 的 <profiles> 可以被子模块继承
reporting报告插件配置可继承

子模块可以覆盖父 POM 的属性或插件配置:

xml
<properties>
    <java.version>11</java.version> <!-- 覆盖父 POM 的 17 -->
</properties>