Maven实战-第十六篇(Maven中的继承)

Maven实战-第十六篇(Maven中的继承)

在上一篇中我们介绍了Maven中聚合的功能,通过聚合的功能可以解决我们项目中管理多个模块的问题。但是这还远远不够,因为我们在实际的多模块开发配置子模块pom.xml文件的时候会发现,我们必须按照Maven的规则和语法来配置pom.xml。这本身是没有任何问题的,但如果我们项目的子模块比较多时,这样就会导致一个问题,也就是很多pom.xml配置重复了。因为不同的模块配置的语法和规则几乎一样,只有个性化的配置不同,这样就会导致重复的工作。并且除了这项工作繁琐外,还不方便我们管理,因为如果我们约定其中某个依赖,都采用相同的版本时,如果依赖升级变更了,我们需要把所有子模块的配置全部修改一遍,这也就违背了Maven方便快捷管理项目的初衷。为了解决这样的问题,Maven中支持继承的功能。了解Java语言的同学知道,在Java语言中我们知道是有父子类的继承关系的,子类可以直接继承父类的内容的。这样当我们不需要更改父类方法或者变量时,就会给子类缺少很多代码,但当我们想要修改时,直接覆盖即可。在Maven中同样采用了这样的设计,我们可以在父pom.xml中配置一些子模块共用的配置,然后在子模块的pom.xml中配置该模块特有的配置,这样就完美解决了上述的问题了。在Maven中有以下的元素可以支持继承:


  • 可以继承父模块的标签
标签 备注
groupId 项目组ID,项目坐标的核心元素。
version 项目版本,项目坐标的核心元素。
description 项目的描述信息。
organization 项目的组织信息。
inceptionYear 项目的创始年份。
url 项目的URL地址。
developers 项目的开发者信息。
contributors 项目的贡献者信息。
distributionManagement 项目的部署配置。
issueManagement 项目的缺陷跟踪系统信息。
ciManagement 项目的持续集成系统信息。
scm 项目的版本控制系统信息。
mailingLists 项目的邮件列表信息。
properties 自定义的Maven属性。
dependencies 项目的依赖配置。
dependencyManagement 项目的依赖管理配置。
repositories 项目的仓库配置。
build 包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等。
reporting 包括项目的报告输出目录配置、报告插件配置等。

我们还是以之前的midai-mazhe-maven项目和mazhe-maven-mall项目为例子,我们看一下如果在子项目中继承父项目的属性标签。

  • pom.xml(midai-mazhe-maven)
<?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>

    <groupId>cn.ma-zhe</groupId>
    <artifactId>midai-mazhe-maven</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>mazhe-maven-user</module>
        <module>mazhe-maven-order</module>
        <module>mazhe-maven-mall</module>
    </modules>

    <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>
  • pom.xml(mazhe-maven-mall)
<?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">
    <parent>
        <artifactId>midai-mazhe-maven</artifactId>
        <groupId>cn.ma-zhe</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>mazhe-maven-mall</artifactId>
</project>

我们看子项目中使用了<parent>标签来引入了父项目的配置。下面我们修改一下父项目的配置,看一下子项目会不会自动的变更。

  • pom.xml(midai-mazhe-maven)
<?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>

    <groupId>cn.ma-zhe</groupId>
    <artifactId>midai-mazhe-maven</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>mazhe-maven-user</module>
        <module>mazhe-maven-order</module>
        <module>mazhe-maven-mall</module>
    </modules>

    <properties>
        <finalName>mazhe-maven-mall-parent</finalName>
    </properties>

</project>

我们在父项目中定义了一个finalName属性,然后我们在子项目中引入这个属性。

  • pom.xml(mazhe-maven-mall)
<?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">
    <parent>
        <artifactId>midai-mazhe-maven</artifactId>
        <groupId>cn.ma-zhe</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>mazhe-maven-mall</artifactId>

    <build>
        <finalName>${finalName}</finalName>
    </build>

</project>

然后我们编译项目看一下mazhe-maven-mall项目会不会按照我们父项目中指定的名称进行打包。

  • 日志
[INFO] Scanning for projects...
[INFO] 
[INFO] ---------------------< cn.ma-zhe:mazhe-maven-mall >---------------------
[INFO] Building mazhe-maven-mall 1.0-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- clean:3.2.0:clean (default-clean) @ mazhe-maven-mall ---
[INFO] Deleting /Users/md/Desktop/midai-mazhe-maven/mazhe-maven-mall/target
[INFO] 
[INFO] --- resources:3.3.1:resources (default-resources) @ mazhe-maven-mall ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /Users/md/Desktop/midai-mazhe-maven/mazhe-maven-mall/src/main/resources
[INFO] 
[INFO] --- compiler:3.11.0:compile (default-compile) @ mazhe-maven-mall ---
[INFO] Changes detected - recompiling the module! :source
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 1 source file with javac [debug target 1.8] to target/classes
[INFO] 
[INFO] --- resources:3.3.1:testResources (default-testResources) @ mazhe-maven-mall ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /Users/md/Desktop/midai-mazhe-maven/mazhe-maven-mall/src/test/resources
[INFO] 
[INFO] --- compiler:3.11.0:testCompile (default-testCompile) @ mazhe-maven-mall ---
[INFO] Changes detected - recompiling the module! :source
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 1 source file with javac [debug target 1.8] to target/test-classes
[INFO] 
[INFO] --- surefire:3.1.2:test (default-test) @ mazhe-maven-mall ---
[INFO] Using auto detected provider org.apache.maven.surefire.junit.JUnit3Provider
[INFO] 
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running MazheMavenMallTest
[INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.013 s -- in MazheMavenMallTest
[INFO] 
[INFO] Results:
[INFO] 
[INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
[INFO] 
[INFO] 
[INFO] --- jar:3.3.0:jar (default-jar) @ mazhe-maven-mall ---
[INFO] Building jar: /Users/md/Desktop/midai-mazhe-maven/mazhe-maven-mall/target/mazhe-maven-mall-parent.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.753 s
[INFO] Finished at: 2023-08-08T06:54:43+08:00
[INFO] ------------------------------------------------------------------------

我们看打包的日志,成功输出了我们父类项目的中指定的打包名称,下面我们看一下target目录中依赖包的名称。

Maven实战-第十六篇(Maven中的继承)

这就是Maven中的继承的功能,当然还有很多其它的属性标签,我们可以通过继承的方式,在父项目中配置,在下一篇中我们在详细的介绍。

Maven

Maven实战-第十五篇(Maven中的聚合)

2023-8-7 6:41:15

Maven

Maven实战-第十七篇(Maven中的依赖管理)

2023-8-9 7:07:54

搜索