除非是简单的项目,实际工作中遇到的大部分Maven项目都是多模块的。每个项目模块都可以独立开发,其中一部分可能会用到其他模块的功能。如何使用 Maven 构建多模块项目?

Maven提供了一种继承和聚合的方式来构建多模块工程,类似于Java中的继承和聚合的概念。

项目继承结构

项目继承可以复用父项目中创建的pom文件的内容。子项目可以自动继承父项目的pom文件属性。

例如,在父项目的 pom 文件中定义如下属性:

<groupId>com.packt.cookbook</groupId>

<artifactId>项目继承</artifactId>

<包装>pom</包装>

<version>1.0-SNAPSHOT</version>

然后在子项目中添加父定义:

<父>

<groupId>com.packt.cookbook</groupId>

<artifactId>项目继承</artifactId>

<version>1.0-SNAPSHOT</version>

</父>

<modelVersion>4.0.0</modelVersion>

<artifactId>子</artifactId>

<包装>罐子</包装>

<name>子项目</name>

有了上面的定义,我们就可以在子项目中使用父项目的pom文件中定义的属性和依赖了。

笔记:

1.父项目必须是pom类型(打包)

2.父项目完全不知道子项目的存在,只有在子项目中定义的父元素才能指定父项目。

一般来说,父项目在子项目的父目录下。如果父项目不在子项目的父目录下,子项目会继续在maven仓库中查找符合要求的父项目。如果需要自己指定父项目的位置,可以添加<relativePath>的新配置。 /parent/pom.xml</relativePath>。

模块化聚合结构

一个父项目可以有很多子项目,而父项目不能清楚的知道它的子项目。使用模块聚合可以让父项目清晰的管理其子项目,子项目可以在不知道其父项目存在的情况下成为一个独立的存在。

如何在父项目中定义模块?只需在父项目的 pom 文件中定义 modules 元素,并为每个子模块创建一个新的模块配置。

<模块>

<模块>管理员</模块>

</模块>

这种管理方式虽然简单,但是不能继承父项目中定义的属性和依赖。每个子模块必须独立定义自己的依赖和属性,这并没有发挥maven项目管理的最大威力。

继承与聚合结合

如何让maven项目既便于继承又便于聚合?答案是结合这两个特性,同时使用继承和聚合。

比如让admin模块继承maven项目,而maven项目使用modules元素显式管理admin模块。

<?xml 版本u003d"1.0" 编码u003d"UTF-8"?>

<project xmlnsu003d"http://maven.apache.org/POM/4.0.0"

xmlns:xsiu003d"http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocationu003d"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>cc.adays</groupId>

<artifactId>maven</artifactId>

<包装>pom</包装>

<version>1.0-SNAPSHOT</version>

<构建>

<插件>

<插件>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-jar-plugin</artifactId>

<版本>2.6</版本>

<配置>

<存档>

<清单>

<addClasspath>true</addClasspath>

<mainClass>cc.adays.Main</mainClass>

</清单>

</存档>

</配置>

</插件>

<插件>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-dependency-plugin</artifactId>

<版本>2.9</版本>

<执行>

<执行>

<id>复制依赖</id>

</执行>

</执行>

</插件>

</插件>

</构建>

<模块>

<模块>管理员</模块>

</模块>

</项目>

父元素在管理子模块的 pom 中定义。

<?xml 版本u003d"1.0" 编码u003d"UTF-8"?>

<project xmlnsu003d"http://maven.apache.org/POM/4.0.0"

xmlns:xsiu003d"http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocationu003d"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<父>

<artifactId>maven</artifactId>

<groupId>cc.adays</groupId>

<version>1.0-SNAPSHOT</version>

</父>

<modelVersion>4.0.0</modelVersion>

<artifactId>管理员</artifactId>

</项目>

这样admin子元素可以直接使用父项目中定义的依赖和属性,而父项目maven可以清晰的管理自己的子元素,一石二鸟。

多模工程的依赖管理

最后,虽然继承确实很好用,但是有时候子项目不想拥有父项目的所有依赖,怎么办?此时,必须依赖依赖管理。在父项目中定义依赖管理,然后在子模块中选择性地使用父项目中已经定义的依赖,非常方便。

举个栗子:

<依赖管理>

<依赖项>

<依赖>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>4.3.10.RELEASE</version>

</依赖>

<!-- https://mvnrepository.com/artifact/junit/junit -->

<依赖>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<版本>4.11</版本>

<范围>测试</范围>

</依赖>

</依赖>

</dependencyManagement>

父项目中定义了两个依赖,spring和Junit,但是我们只想在我们的子模块中使用JUnit,所以在子模块的pom文件中,我们定义:

<依赖项>

<依赖>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

</依赖>

</依赖>

图片.png

这里不需要定义版本和范围,因为它们是从父项目自动继承的。

同样的,你可以通过这种方式管理maven的插件。您只需要使用插件管理元素。具体使用方式与管理依赖的方式相同。

Logo

Redis社区为您提供最前沿的新闻资讯和知识内容

更多推荐