从普通 Java 练习过渡到带有多个依赖的项目后,手动下载和管理 Jar 包会变得麻烦。依赖版本不同、目录结构不一致、打包方式不统一,都可能让项目换一台电脑就无法运行。我开始接触 Maven,主要也是想把这些重复工作交给工具处理。
Maven 的特点
Maven 是一个以项目对象模型(Project Object Model,POM)为核心的构建工具。项目需要哪些依赖、使用什么 Java 版本、怎样编译和打包,通常都写在 pom.xml 中。
它的几个特点比较明显:
- 依赖管理:根据坐标下载依赖,并处理依赖的传递关系。
- 约定优于配置:默认使用
src/main/java、src/test/java和target等目录。 - 生命周期:编译、测试、打包和发布有固定顺序。
- 插件机制:编译、测试、打包等操作实际由插件完成。
- 多模块支持:父工程可以聚合多个子模块,并统一管理版本。
Maven 不只是依赖下载器下载 Jar 包只是 Maven 的一部分。它更重要的作用,是用一套相对统一的方式描述和构建 Java 项目。
POM 的基础配置
下面是一个简化后的 pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0"> <modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId> <artifactId>maven-demo</artifactId> <version>1.0-SNAPSHOT</version>
<properties> <maven.compiler.release>17</maven.compiler.release> </properties>
<dependencies> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>5.11.0</version> <scope>test</scope> </dependency> </dependencies></project>groupId一般表示组织或项目组,artifactId是模块名称,version是当前版本,三者共同组成依赖坐标。properties适合保存 Java 版本等公共配置,dependencies用于声明项目真正需要使用的依赖。若还需要修改编译、测试或打包行为,则可以在build/plugins中配置对应插件。
生命周期与常用命令
Maven 的默认生命周期可以简单理解为:
compile → test → package → verify → install → deploy执行后面的阶段时,前面的阶段也会按顺序执行。例如运行mvn package,Maven 会先完成编译和测试,再生成 Jar 或 War。
mvn -v # 查看 Maven 与 Java 环境mvn clean # 删除 target 构建目录mvn compile # 编译主代码mvn test # 执行测试mvn package # 打包项目mvn install # 打包并安装到本地仓库mvn dependency:tree # 查看完整依赖树package和install比较容易混淆。前者只生成构建产物,后者还会把产物放入本地仓库,所以其他本地项目可以继续引用它。
依赖冲突怎么查当项目出现版本冲突或类找不到时,可以先运行
mvn dependency:tree,确认某个依赖是由哪条路径传递进来的,再决定统一版本或排除依赖。
一个简单的多模块项目
项目变大后,可以拆成多个职责不同的模块:
demo-parent├─ common├─ user-service└─ order-service父工程通常使用pom作为打包类型,通过modules聚合子模块,再使用dependencyManagement集中管理依赖版本。构建整个项目可以执行mvn clean package;如果只想构建订单服务及其依赖,可以使用:
mvn -pl order-service -am package其中-pl选择模块,-am会同时构建它依赖的其他模块。这种方式比逐个进入目录打包更方便,也不容易漏掉公共模块。
我对 Maven 的看法
我觉得 Maven 好用的地方不在于命令少,而在于它让不同 Java 项目拥有相似的目录、依赖和构建流程。尤其在多模块项目中,父 POM、版本管理和统一构建能减少不少重复配置。
它难用的地方也比较明显:XML 写起来偏长,父 POM 和传递依赖又会隐藏一部分真实配置,出现版本冲突时不够直观。因此入门阶段不用急着记住所有插件,先理解 POM、生命周期和依赖树,已经能够解决大部分常见问题。