在上一篇中我们介绍了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中的继承的功能,当然还有很多其它的属性标签,我们可以通过继承的方式,在父项目中配置,在下一篇中我们在详细的介绍。