Maven项目管理工具
# Maven 项目管理工具
# 分模块开发与设计
# 工程模块与模块划分
在 Maven 项目中,模块是指将一个大型项目拆分成多个独立的子项目,每个子项目都有自己的 pom.xml 文件。这种模块化的划分可以带来许多好处,包括更好的代码组织、更容易的维护和测试、更好的团队协作等。
# 常见的模块划分方式
功能划分:根据不同的功能将项目划分为多个模块,例如用户管理模块、订单管理模块、支付模块等。这种划分方式可以使每个模块专注于特定的功能,便于团队成员的协作和独立开发。
业务领域划分:根据不同的业务领域将项目划分为多个模块,例如电商模块、金融模块、物流模块等。这种划分方式可以使每个模块独立演化,便于团队成员的专注和理解。
技术层面划分:根据不同的技术层面将项目划分为多个模块,例如前端模块、后端模块、数据库模块等。这种划分方式可以使每个模块专注于特定的技术领域,便于团队成员的专长发挥和独立开发。
在划分模块时,需要考虑模块之间的依赖关系和版本管理。可以使用 Maven 的父子模块关系来管理模块之间的依赖关系,并在父模块的 pom.xml 中定义共享的依赖和插件版本,这样可以确保模块之间的一致性和版本控制。
# 聚合
# 作用
聚合用于快速构建 Maven 工程,一次性构建多个项目/模块。
# 制作方式
- 创建一个父模块,打包类型定义为
pom。 - 在父模块的
pom.xml中通过<modules>标签定义当前模块进行构建操作时关联的其他模块名称。
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<modules>
<module>child-project1</module>
<module>child-project2</module>
<module>child-project3</module>
</modules>
</project>
2
3
4
5
6
7
8
9
10
11
12
13
# 注意事项
参与聚合操作的模块最终执行顺序与模块间的依赖关系有关,与配置顺序无关。Maven 会自动根据依赖关系确定构建顺序。
# 继承
# 描述
在 Maven 中,可以使用继承来实现项目之间的代码和配置的共享。Maven 继承是通过在父项目中定义一组通用的配置和依赖,然后在子项目中继承这些配置和依赖来实现的。
要使用 Maven 继承,需要创建一个父项目(也称为聚合项目)和一个或多个子项目。父项目中定义了一些通用的配置,例如插件版本、依赖管理等。子项目可以继承父项目的配置,并可以添加自己的特定配置。
# 实现
# 父项目的 pom.xml
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<modules>
<module>child-project1</module>
<module>child-project2</module>
</modules>
</project>
2
3
4
5
6
7
8
9
10
11
12
# 子项目的 pom.xml
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<version>1.0.0</version>
<relativePath>../parent-project/pom.xml</relativePath>
</parent>
<artifactId>child-project1</artifactId>
<!-- groupId 和 version 可以从父项目继承,无需重复声明 -->
</project>
2
3
4
5
6
7
8
9
10
11
12
13
# 继承依赖定义
# 描述
在 Maven 中,可以使用 <dependencyManagement> 来定义依赖关系。通过在父项目的 pom.xml 文件中定义依赖管理,子项目可以继承这些依赖版本,从而实现共享和统一管理。
子项目可以通过在其 pom.xml 文件中使用 <dependencies> 元素来继承父项目的依赖。当子项目中引用一个依赖时,Maven 会首先查找子项目自身的依赖定义,如果找不到,则会继续查找父项目的依赖定义。
这种继承依赖定义的方式可以简化项目的管理,避免重复定义相同的依赖,并确保所有子项目使用相同的依赖版本。同时,通过在父项目中集中管理依赖,可以更方便地进行版本升级和依赖冲突的解决。
# 案例展示
父项目的 pom.xml 中的 <dependencyManagement> 定义:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>dependency1</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>dependency2</artifactId>
<version>2.0.0</version>
</dependency>
</dependencies>
</dependencyManagement>
2
3
4
5
6
7
8
9
10
11
12
13
14
子项目继承父项目的依赖(无需指定版本号):
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>dependency1</artifactId>
<!-- 版本号由父 POM 的 dependencyManagement 统一管理 -->
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>dependency2</artifactId>
</dependency>
</dependencies>
2
3
4
5
6
7
8
9
10
11
# 属性
# 自定义属性
# 作用
等同于定义变量,方便统一维护版本号等配置。
# 定义格式
<properties>
<spring.version>5.3.29</spring.version>
<junit.version>4.13.2</junit.version>
</properties>
2
3
4
# 调用格式
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
2
3
4
5
# 内置属性
# 作用
使用 Maven 内置属性,快速配置。
# 常用内置属性
| 属性 | 说明 |
|---|---|
${basedir} | 项目根目录 |
${version} | 项目版本号 |
${project.basedir} | 项目根目录(推荐写法) |
${project.version} | 项目版本号(推荐写法) |
${project.build.directory} | 构建输出目录(即 target) |
${project.artifactId} | 项目的 artifactId |
# Setting 属性
# 作用
使用 Maven 配置文件 settings.xml 中的属性,用于动态配置。
# 调用格式
${settings.localRepository}
# Java 系统属性
# 作用
读取 Java 系统属性,用于动态配置。
# 调用格式
${user.home}
# 系统属性查询方式
mvn help:system
# 环境变量属性
# 作用
使用操作系统环境变量,用于动态配置。
# 调用格式
${env.JAVA_HOME}
# 环境变量属性查询方式
mvn help:system
# 版本管理
# 简介
Maven 提供了版本管理的功能。在 Maven 中,你可以使用版本号来管理项目的不同版本。Maven 的版本号遵循一定的规则,通常采用以下格式:
主版本号.次版本号.增量版本-里程碑版本
| 版本组成 | 说明 | 示例 |
|---|---|---|
| 主版本号 | 表示项目重大架构的变更 | Spring 5 相较于 Spring 4 |
| 次版本号 | 表示有较大的功能增加和变化,或者全面系统地修复漏洞 | 5.3 → 5.4 |
| 增量版本 | 表示有重大漏洞的修复 | 5.3.28 → 5.3.29 |
| 里程碑版本 | 表示一个版本内部的里程碑 | M1、RC1、GA |
例如,1.0.0 是一个常见的版本号格式。在 Maven 中,你可以在项目的 pom.xml 文件中指定版本号,也可以使用属性来定义版本号,以便在构建过程中灵活地修改它。
# 工程版本分类
# SNAPSHOT(快照版本)
项目开发过程中,为了方便团队成员合作,解决模块间相互依赖和及时更新的问题,开发者对每个模块进行构建时输出的临时性版本叫快照版本(测试阶段版本)。
快照版本会随着开发的进展不断更新。
# RELEASE(发布版本)
项目开发到进入阶段里程碑后,向团队外部发布较为稳定的版本,该版本所对应的构建文件是稳定的。即便进行功能的后续开发,也不会改变当前发布版本内容,这种版本称之为发布版本。
# 资源配置
Maven 可以通过 <resources> 标签配置资源文件的处理方式,支持在资源文件中使用 Maven 属性进行变量替换。
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
2
3
4
5
6
7
8
9
10
11
12
<filtering>true</filtering>表示开启资源过滤,会将资源文件中的${...}占位符替换为 Maven 属性的值。
# 多环境开发配置
# 配置方式
在 pom.xml 中通过 <profiles> 定义多个环境配置:
<profiles>
<!-- 开发环境 -->
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<profile.name>dev</profile.name>
</properties>
</profile>
<!-- 内网测试环境 -->
<profile>
<id>sit</id>
<properties>
<profile.name>sit</profile.name>
</properties>
</profile>
<!-- 生产环境 -->
<profile>
<id>prod</id>
<properties>
<profile.name>prod</profile.name>
</properties>
</profile>
</profiles>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 加载指定环境
mvn 指令 -P 环境定义id
# 范例
# 使用生产环境配置进行构建
mvn install -P prod
# 使用开发环境配置进行构建
mvn install -P dev
2
3
4
5
# 跳过测试
# 命令行方式
在 Maven 中,可以使用 -DskipTests 参数来跳过测试阶段:
mvn clean install -DskipTests
上述命令将执行 Maven 的 clean 和 install 目标,并跳过测试阶段。这意味着在构建过程中不会执行任何测试。
# 插件配置方式
如果只想跳过特定的测试类或测试方法,可以使用 maven-surefire-plugin 插件的 skip 或 excludes 配:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
<!-- 或者使用以下配置来排除特定的测试类 -->
<!--
<excludes>
<exclude>com.example.MyTest</exclude>
</excludes>
-->
<!-- 或者使用以下配置来包含特定的测试类 -->
<!--
<includes>
<include>com.example.MyTest</include>
</includes>
-->
</configuration>
</plugin>
</plugins>
</build>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 私服
# Nexus
Nexus 是 Sonatype 公司的一款 Maven 私服产品。
下载地址:https://www.sonatype.com/download-oss-sonatype (opens new window)
# 仓库分类
| 仓库类型 | 说明 |
|---|---|
| hosted | 宿主仓库,存放本地项目产生的构建,团队内部开发的通用组件库、公共 jar 等都发布到这里 |
| proxy | 代理仓库,用来代理远程仓库,如代理 Maven 中央仓库等 |
| group | 仓库组,可以聚合 hosted 和 proxy 仓库,暴露为一个地址,方便统一访问 |
# 访问私服配置
# 配置 settings.xml 中的服务器认证信息
<servers>
<server>
<id>nexus-releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>nexus-snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
2
3
4
5
6
7
8
9
10
11
12
# 配置项目访问私服上传资源(pom.xml)
<distributionManagement>
<repository>
<id>nexus-releases</id>
<url>http://localhost:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus-snapshots</id>
<url>http://localhost:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
2
3
4
5
6
7
8
9
10
# 发布资源到私服
mvn deploy
注意:
pom.xml中<repository>的<id>必须与settings.xml中<server>的<id>一致,Maven 才能找到对应的认证信息。
# 阿里云 Maven 镜像
# 配置方式
在 settings.xml 中添加镜像配置:
<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
2
3
4
5
6
7
8