Parent
Maven Parent POM
什么是 Parent POM
Parent POM (Parent Project Object Model) 是 Maven 中一种特殊的 POM 文件,用于在多模块项目中共享配置。它允许我们将通用的配置、插件、依赖管理等信息集中定义在一个地方,然后被子模块继承,从而实现配置的复用和统一管理。
为什么需要 Parent POM
在复杂的多模块项目中,通常会面临以下挑战:
- 配置重复:各个子模块需要配置相同的编译选项、插件、依赖等
- 版本不一致:不同模块可能使用不同的插件版本或 Java 版本
- 维护困难:当需要修改公共配置时,需要逐一修改每个模块
- 缺乏一致性:各模块可能采用不同的构建标准和规范
Parent POM 解决了这些问题:
- 集中管理通用配置,避免重复
- 统一项目构建标准和规范
- 简化子模块的 POM 文件
- 便于维护和升级
Parent POM 的作用
Parent POM 主要提供以下功能:
1. 属性定义 (Properties)
集中定义项目中使用的各种属性,如版本号、编码格式等:
xml
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>2. 依赖管理 (Dependency Management)
通过 <dependencyManagement> 统一管理依赖版本:
xml
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
</dependencyManagement>3. 插件管理 (Plugin Management)
通过 <pluginManagement> 统一管理插件版本和配置:
xml
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
</plugins>
</pluginManagement>4. 资源配置
统一定义资源过滤和包含规则。
如何使用 Parent POM
1. 创建 Parent POM
创建一个 packaging 为 pom 的项目:
xml
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>my-parent</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<!-- 公共配置 -->
</project>2. 在子模块中继承 Parent POM
在子模块的 pom.xml 中添加 parent 元素:
xml
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.example</groupId>
<artifactId>my-parent</artifactId>
<version>1.0.0</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>my-child-module</artifactId>
<!-- 子模块特有配置 -->
</project>Parent POM 最佳实践
1. 合理组织结构
- 将共同配置放在 Parent POM 中
- 子模块只保留特有的配置
- 避免过度继承导致的复杂性
2. 版本管理
- 使用属性统一管理版本号
- 定期更新和维护依赖版本
- 确保版本兼容性
3. 插件配置
- 在 Parent POM 中预配置常用插件
- 为不同类型的项目提供不同的插件集
- 保持插件配置的合理性
4. 多层级继承
对于大型项目,可以使用多层级 Parent POM:
root-parent (最基础配置)
├── java-parent (Java 项目通用配置)
│ ├── spring-parent (Spring 项目配置)
│ └── ...
└── web-parent (Web 项目通用配置)
├── spring-web-parent (Spring Web 项目配置)
└── ...sh-parent 实现详解
概述
sh-parent 是 sh-framework 框架的核心父工程,为所有子模块和业务项目提供统一的构建配置、依赖管理和插件配置。它继承自 Spring Boot Parent 4.0.0,并集成了 sh-bom 进行依赖版本管理。
核心特性
标准化构建配置
- Java 25 编译配置
- UTF-8 编码统一
- 源码打包自动生成
- 注解处理器预配置
依赖版本管理
- 通过
sh-bom统一管理第三方依赖版本 - 管理所有 sh-framework 模块版本
- 管理微服务模块版本
- 通过
插件预配置
- maven-compiler-plugin:Java 25 编译
- maven-source-plugin:源码打包
- flatten-maven-plugin:CI/CD 友好
- exec-maven-plugin:外部命令执行
最佳实践集成
- 统一的构建标准
- CI/CD 友好配置
- 多模块项目管理
- 版本控制策略
在 sh-framework 子模块中使用
xml
<!-- sh-core/pom.xml -->
<project>
<modelVersion>4.0.0</modelVersion>
<!-- 继承 sh-parent -->
<parent>
<groupId>com.wkclz.framework</groupId>
<artifactId>sh-parent</artifactId>
<version>5.0.0-SNAPSHOT</version>
<relativePath>../sh-parent/pom.xml</relativePath>
</parent>
<artifactId>sh-core</artifactId>
<dependencies>
<!-- 无需指定版本,版本由 sh-bom 统一管理 -->
<dependency>
<groupId>com.wkclz.framework</groupId>
<artifactId>sh-tool</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>在业务项目中使用
xml
<!-- 业务项目 pom.xml -->
<project>
<modelVersion>4.0.0</modelVersion>
<!-- 继承 sh-parent -->
<parent>
<groupId>com.wkclz.framework</groupId>
<artifactId>sh-parent</artifactId>
<version>5.0.0-SNAPSHOT</version>
</parent>
<groupId>com.example</groupId>
<artifactId>my-business-app</artifactId>
<version>1.0.0</version>
<dependencies>
<!-- 使用 sh-framework 组件 -->
<dependency>
<groupId>com.wkclz.framework</groupId>
<artifactId>sh-core</artifactId>
</dependency>
<dependency>
<groupId>com.wkclz.framework</groupId>
<artifactId>sh-mybatis</artifactId>
</dependency>
<dependency>
<groupId>com.wkclz.framework</groupId>
<artifactId>sh-redis</artifactId>
</dependency>
<!-- 使用微服务模块 -->
<dependency>
<groupId>com.wkclz.microapp</groupId>
<artifactId>micro-dict</artifactId>
</dependency>
<dependency>
<groupId>com.wkclz.microapp</groupId>
<artifactId>micro-file</artifactId>
</dependency>
</dependencies>
</project>管理的模块版本
框架核心模块
sh-tool:工具模块sh-core:核心模块sh-mybatis:ORM 模块sh-dynamicdb:动态数据源sh-redis:缓存模块sh-spring:Spring 集成sh-xxljob:任务调度sh-mqtt:消息队列sh-web:Web 模块
微服务模块
micro-audit:审计服务micro-dict:字典服务micro-file:文件服务micro-liteflow:规则引擎micro-form:表单服务micro-fun:函数服务micro-mask:脱敏服务micro-msg:消息服务micro-pay:支付服务micro-pdf:PDF 服务micro-rmcheck:关联检查micro-seq:序列服务micro-wxapp:微信小程序micro-wxmp:微信公众号
配置详解
属性配置
xml
<properties>
<!-- 项目版本 -->
<revision>5.0.0-SNAPSHOT</revision>
<!-- Java 配置 -->
<maven.compiler.source>25</maven.compiler.source>
<maven.compiler.target>25</maven.compiler.target>
<maven.compiler.release>25</maven.compiler.release>
<!-- 编码配置 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 插件版本 -->
<flatten-maven-plugin.version>1.7.3</flatten-maven-plugin.version>
</properties>依赖管理
xml
<dependencyManagement>
<dependencies>
<!-- 导入 sh-bom 进行依赖版本管理 -->
<dependency>
<groupId>com.wkclz.framework</groupId>
<artifactId>sh-bom</artifactId>
<version>${revision}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 管理框架模块版本 -->
<dependency>
<groupId>com.wkclz.framework</groupId>
<artifactId>sh-core</artifactId>
<version>${revision}</version>
</dependency>
<!-- 管理微服务模块版本 -->
<dependency>
<groupId>com.wkclz.microapp</groupId>
<artifactId>micro-dict</artifactId>
<version>${revision}</version>
</dependency>
</dependencies>
</dependencyManagement>最佳实践
1. 新项目搭建
xml
<!-- 父项目 pom.xml -->
<parent>
<groupId>com.wkclz.framework</groupId>
<artifactId>sh-parent</artifactId>
<version>5.0.0-SNAPSHOT</version>
</parent>
<groupId>com.example</groupId>
<artifactId>my-project</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<modules>
<module>common</module>
<module>service</module>
<module>web</module>
</modules>2. 现有项目迁移
- 添加
<parent>元素 - 移除重复配置
- 简化依赖声明(移除版本)
- 测试构建流程
3. 自定义配置
xml
<properties>
<!-- 覆盖 Java 版本 -->
<maven.compiler.source>25</maven.compiler.source>
<maven.compiler.target>25</maven.compiler.target>
</properties>
<build>
<plugins>
<!-- 添加额外插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>3.3.1</version>
</plugin>
</plugins>
</build>常见问题
Q1: sh-parent 和 sh-bom 的区别?
- sh-parent:完整构建配置(插件、属性、依赖管理)
- sh-bom:仅依赖版本管理
- 关系:
sh-parent导入sh-bom
Q2: 如何查看有效配置?
bash
mvn help:effective-pom
mvn dependency:treeQ3: 如何更新版本?
xml
<parent>
<groupId>com.wkclz.framework</groupId>
<artifactId>sh-parent</artifactId>
<version>5.0.1-SNAPSHOT</version>
</parent>Q4: 依赖冲突怎么办?
bash
# 分析依赖树
mvn dependency:tree -Dverbose
# 排除冲突
<dependency>
<groupId>冲突的groupId</groupId>
<artifactId>冲突的artifactId</artifactId>
<exclusions>
<exclusion>
<groupId>要排除的groupId</groupId>
<artifactId>要排除的artifactId</artifactId>
</exclusion>
</exclusions>
</dependency>总结
sh-parent 提供:
- ✅ 标准化 Maven 构建配置
- ✅ 统一的依赖版本管理
- ✅ 预配置的构建插件
- ✅ 完整的框架生态支持
通过使用 sh-parent,开发者可以:
- 快速启动新项目
- 减少配置复杂度
- 保证项目质量
- 享受统一的开发体验
开始使用 sh-parent,让构建配置更简单!