一、Maven 基础总结
1. Maven 核心概念
- 项目对象模型(POM):通过
pom.xml
文件管理项目配置,包括坐标(groupId、artifactId、version)、依赖、构建插件等。 - 依赖管理:通过坐标引入外部库,支持传递依赖、可选依赖、排除依赖和依赖范围控制。
- 生命周期:定义项目构建的标准化流程(clean、default、site),每个阶段绑定特定插件目标。
- 仓库管理:本地仓库、中央仓库、私服(如 Nexus)协同管理依赖包。
2. 安装与配置
- 环境配置:
- 配置
MAVEN_HOME
环境变量,将bin
目录添加到PATH
。 - 修改
settings.xml
中的本地仓库路径和镜像(如阿里云镜像加速)。
- 配置
- 初始化项目:
- 使用
mvn archetype:generate
创建项目(Java/Web),或通过 IDEA 集成工具生成。
- 使用
3. 依赖管理
- 依赖配置:
<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency> </dependencies>
- 依赖传递:直接依赖与间接依赖的传递性,冲突时遵循最短路径优先和声明顺序优先。
- 依赖范围:
范围 主程序有效 测试有效 参与打包 典型案例 compile Y Y Y log4j test N Y N junit provided Y Y N servlet-api runtime N Y Y jdbc 驱动
4. 生命周期与插件
- Default 生命周期:从编译到部署的完整流程(validate → compile → test → package → install → deploy)。
- 常用插件:
maven-compiler-plugin
:指定 Java 版本。tomcat7-maven-plugin
:部署 Web 项目到 Tomcat。maven-source-plugin
:生成源代码 JAR。
5. 缺漏补充
- 依赖调解策略:
- 最短路径优先:优先选择依赖路径最短的版本。
- 声明顺序优先:若路径长度相同,后声明的依赖覆盖先声明的。
- 依赖树分析:使用
mvn dependency:tree
命令查看项目依赖结构。
二、Maven 高级总结
1. 分模块开发
- 聚合(Aggregation):通过父 POM 的
<modules>
标签管理子模块,统一构建。 - 继承(Inheritance):子模块通过
<parent>
标签继承父 POM 的配置(如依赖、插件)。 - 模块间依赖:子模块通过坐标直接依赖其他模块。
一、聚合(Aggregation)
1. 作用
通过父 POM 统一管理多个子模块的构建过程,支持一键构建所有子模块。
2. 实现步骤
- 创建父项目
<!-- 父POM的packaging必须为pom --> <packaging>pom</packaging> <modules><!-- 子模块路径(相对于父POM的位置) --><module>../ssm_controller</module><module>../ssm_service</module> </modules>
- 子模块无需特殊配置
子模块的 POM 中无需重复父 POM 的 groupId、version 等信息。
3. 聚合构建命令
# 在父项目目录执行,自动构建所有子模块
mvn clean install
4. 优势
- 简化多模块项目的构建流程。
- 确保子模块版本一致性。
二、继承(Inheritance)
1. 作用
子模块继承父 POM 的配置(如依赖、插件、属性),避免重复代码。
2. 实现步骤
- 父 POM 定义共享配置
<properties><spring.version>5.1.9.RELEASE</spring.version> </properties> <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency> </dependencies>
- 子模块继承父 POM
<parent><groupId>com.itheima</groupId><artifactId>ssm</artifactId><version>1.0-SNAPSHOT</version><!-- 父POM路径(可选,默认查找本地仓库) --><relativePath>../ssm/pom.xml</relativePath> </parent>
3. 覆盖父配置
子模块可通过相同标签覆盖父 POM 的配置:
<!-- 子模块中修改spring版本 -->
<properties><spring.version>5.2.0.RELEASE</spring.version>
</properties>
4. 注意事项
- 父 POM 的
packaging
必须为pom
。 - 子模块无需声明
groupId
和version
(除非需要覆盖)。
三、模块间依赖
1. 依赖方式
子模块通过坐标直接依赖其他子模块:
<!-- 子模块A的POM -->
<dependencies><dependency><groupId>com.itheima</groupId><artifactId>ssm_service</artifactId><version>1.0-SNAPSHOT</version></dependency>
</dependencies>
2. 依赖传递规则
- 直接依赖:子模块 A 显式依赖子模块 B。
- 间接依赖:子模块 C 依赖子模块 A,则自动继承子模块 A 对 B 的依赖(传递性)。
- 冲突解决:遵循最短路径优先或声明顺序优先(后声明的覆盖)。
3. 依赖范围
默认范围为compile
,可根据需要调整:
<dependency><groupId>com.itheima</groupId><artifactId>ssm_dao</artifactId><version>1.0-SNAPSHOT</version><scope>provided</scope> <!-- 仅编译和测试有效,不参与打包 -->
</dependency>
4. 循环依赖
- 问题:模块 A 依赖 B,B 又依赖 A,导致构建失败。
- 解决方案:
- 重构模块职责,拆分公共部分。
- 使用接口与实现分离(如 A 依赖 B 的接口,B 依赖 A 的实现)。
四、分模块开发最佳实践
-
项目结构
plaintext
parent/pom.xmlmodule1/pom.xmlmodule2/pom.xml
-
父 POM 原则
- 只负责管理配置(依赖、插件、属性),不包含业务代码。
- 使用
dependencyManagement
统一管理依赖版本,避免子模块重复声明。
-
子模块原则
- 职责单一(如
ssm_dao
负责数据访问,ssm_service
负责业务逻辑)。 - 通过接口暴露功能,降低模块间耦合。
- 职责单一(如
-
IDE 集成
- 在 IntelliJ IDEA 中,父项目需标记为 “Maven Projects”,子模块自动关联。
- 使用
Reimport
按钮同步 POM 变更。
五、常见问题
-
子模块无法继承父 POM 配置
- 检查父 POM 的
relativePath
是否正确。 - 确保父 POM 已安装到本地仓库(
mvn install
)。
- 检查父 POM 的
-
模块间依赖找不到
- 确认子模块已构建(
mvn install
)。 - 检查坐标(groupId、artifactId、version)是否匹配。
- 确认子模块已构建(
-
构建顺序问题
- 子模块 A 依赖 B 时,确保 B 先于 A 构建(Maven 会自动按依赖顺序构建)。
六、总结
分模块开发通过聚合、继承和模块间依赖,实现了:
- 代码复用:共享基础配置和通用库。
- 低耦合:模块职责清晰,便于单独维护。
- 高效协作:团队可并行开发不同模块,通过私服共享中间成果。
合理使用分模块设计能显著提升大型项目的可维护性和开发效率。
2. 属性管理
- 自定义属性:
xml
<properties><spring.version>5.1.9.RELEASE</spring.version> </properties> <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version> </dependency>
- 内置属性:
${basedir}
:项目根目录。${user.home}
:用户主目录。${env.JAVA_HOME}
:Java_HOME 环境变量。
3. 多环境配置
- Profiles:
xml
<profiles><profile><id>dev</id><properties><jdbc.url>jdbc:dev</jdbc.url></properties><activation><activeByDefault>true</activeByDefault></activation></profile> </profiles>
- 激活方式:通过
mvn install -P dev
指定环境。
4. 跳过测试
- 三种方式:
- 命令行:
mvn install -DskipTests
。 - IDEA 界面:在 Maven 面板勾选跳过测试。
- 配置文件:
xml
<plugin><artifactId>maven-surefire-plugin</artifactId><configuration><skipTests>true</skipTests></configuration> </plugin>
- 命令行:
5. 私服(Nexus)
- 仓库类型:
- 宿主仓库(Hosted):存储私有项目或第三方非开源库。
- 代理仓库(Proxy):代理中央仓库或其他远程仓库。
- 仓库组(Group):组合多个仓库,简化配置。
- 配置步骤:
- 修改
settings.xml
添加私服镜像和认证信息。 - 在项目 POM 中配置
distributionManagement
指定发布路径。 - 使用
mvn deploy
上传到私服。
- 修改
6. 缺漏补充
- 版本管理:
- 使用
-SNAPSHOT
标识开发版本,release
标识正式版本。 - 通过
mvn versions:set
统一更新模块版本。
- 使用
- 资源过滤:
<resources><resource><directory>src/main/resources</directory><filtering>true</filtering></resource> </resources>
通过属性替换配置文件中的变量(如数据库 URL)。
三、总结与扩展建议
- 核心优势:Maven 通过标准化的项目结构、依赖管理和生命周期,显著提升团队协作效率。
- 最佳实践:
- 统一使用私服管理依赖,避免中央仓库访问不稳定。
- 定期清理本地仓库(
mvn dependency:purge-local-repository
)。 - 使用
mvn dependency:analyze
分析未使用的依赖。
- 扩展学习:
- 持续集成(CI):与 Jenkins 集成自动化构建。
- 构建工具对比:对比 Gradle 与 Maven 的优缺点。
- 高级插件:学习
maven-release-plugin
实现版本发布自动化。
通过以上总结,用户可全面掌握 Maven 的核心功能及高级应用,进一步提升项目管理与构建效率。