Maven模块化管理
大约 3 分钟
模块化管理概述
在一个大项目中,通常有许多的子模块,子模块间依赖管理,最主要的就是版本号的统一,Maven模块化管理,即将各个子模块中的版本号(模块自身的、依赖的)都交由一个“父模块”进行管理,从而实现对子模块依赖的统一管理。

创建父工程
Maven 管理多模块应用的实现是互联网项目中多使用分布式开发,那么每个独立的服 务都会使用独立的项目进行维护,那么这样就需要使用多模块应用管理,来实现项目的高度统一。
<groupId>com.guitar</groupId>
<artifactId>maven-parent</artifactId>
<version>1.0</version>Maven允许创建一个父工程,父工程打包方式必须为 pom。
<packaging>pom</packaging>- 只保留 pom.xml 即可,通常会删除src目录。
父工程中的依赖<dependencies>、构建<build> 等配置在子工程内一样生效。
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<!-- dependencies下的所有依赖,子工程都会继承,直接可以用 -->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
<properties>
<!--指定编译、运行java版本,子工程一样会继承-->
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<!--采用属性的方式管理版本号-->
<spring.version>6.0.11</spring.version> <!-- 单词间也可用-划分 -->
</properties>
<!--
dependencyManagement 中的所有依赖,子工程可以按需采用“声明式导入”,
声明式导入时,如果没有指定version(即只提供了groupId + artifactId),则采用父工程里管理的 version
-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.32</version>
</dependency>
</dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencyManagement><dependencyManagement>只是管理依赖版本号的一个标签,不是父工程的专属。
创建子工程
创建子工程,需要在 pom 文件中使用 <parent> 标签。
<parent>
<!--父工程 GAV-->
<groupId>com.guitar</groupId>
<artifactId>maven-parent</artifactId>
<version>1.0</version>
<!-- <relativePath>../maven-parent/pom.xml</relativePath> 可选,指向父工程pom文件的相对路径 -->
</parent>
<artifactId>maven-sub-1</artifactId>子工程会继承父工程里的几乎所有配置,包括properties、build、dependencies、dependencyManagement等等。
子工程的依赖:
父工程
<dependencies>下的所有依赖当依赖很多时,可能会有很多没用的依赖,此时就造成了浪费。
通常采用 父工程
<dependencyManagement> + <properties>,子工程“声明式导入”的方式。自身
<dependencies>下的所有依赖<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <!-- version缺省时,会从 <dependencyManagement> 里找(不论是继承的或自身的) --> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>6.0.11</version> <!--手动指定版本时,以手动指定的为准--> </dependency> </dependencies>
模块的聚合
在目录结构(模块的目录结构,通常和路径相对应)上,有时需要将多个模块整合至一个父工程下。此时可以使用 <moduels>。
父工程:
<packaging>pom</packaging>
<modules>
<module>../dom4j-test/pom.xml</module>
<!--也可以是 pom.xml 所在的目录,如 ../dom4j-test -->
</modules>
模块目录结构通常与模块的文件路径相对应;
- 如果不采用聚合,则通常父工程、子工程同级;
- 如果采用聚合,则子工程存放于父工程的木目录下。
- 不采用聚合的目录结构更舒朗,是更常见的做法。
