虽然 IDEA 内置了捆绑版的 Maven,但为了统一团队开发环境和利用自定义配置(如阿里云镜像),建议手动指定本地安装的 Maven。
打开设置:
Windows/Linux: File -> Settings
macOS: IntelliJ IDEA -> Preferences ( 或 Cmd + ,)
定位 Maven 选项:
在左侧导航栏中,依次展开 Build, Execution, Deployment -> Build Tools -> Maven。
关键参数设置:
Maven home path:点击文件夹图标,选择你之前解压的 Maven 安装目录。
注意:不要选择 bundled (Maven 3),除非你确实想使用 IDEA 自带的版本。
User settings file:通常会自动识别为 ~/.m2/settings.xml。如果未自动识别,请手动指向你自定义的 settings.xml 文件路径。
Local repository:会根据 settings.xml 中的配置自动显示本地仓库路径。
应用并保存:点击 Apply 和 OK。
配置完成后,IDEA 右下角通常会弹出提示正在导入 Maven 项目。你可以在右侧边栏找到 Maven 面板,展开后能看到项目的生命周期(Lifecycle)和插件(Plugins)。如果能看到具体的任务列表,说明配置成功。
小贴士:建议在
File->New Projects Setup->Settings for New Projects中也进行同样的配置。这样以后新建的所有项目都会默认使用你指定的 Maven 环境,无需重复配置。
Maven 通过一组坐标来唯一标识世界上的任何一个构件(JAR 包、插件或项目)。这就好比每个人的身份证号,确保了依赖引用的准确性。
在 pom.xml 中,这三个元素是必须定义的:
groupId (组织 ID)
含义:标识项目所属的组织、公司或团体。
规范:通常采用域名反写的形式,以避免命名冲突。
示例:阿里巴巴的开源项目常用 com.alibaba,Apache 基金会的项目常用 org.apache。
代码:<groupId>com.example</groupId>
artifactId (项目 ID)
含义:标识具体的项目名称或模块名称。
规范:在同一个 groupId 下必须唯一。通常使用小写字母,单词间用连字符 - 分隔。
示例:my-project, user-service, common-utils。
代码:<artifactId>demo</artifactId>
version (版本号)
含义:标识项目当前的版本状态。
规范:遵循语义化版本规范(见下文)。
代码:<version>1.0-SNAPSHOT</version>
packaging (打包方式)
定义构建产物的格式。默认为 jar。
常见值:jar (Java 库), war (Web 应用), pom (聚合项目 / 父工程)。
代码:<packaging>war</packaging>
classifier (分类器)
用于区分同一版本的不同构建产物(如源码包、文档包)。
常见值:sources (源码), javadoc (文档)。
示例:mysql-connector-j-8.0.33-sources.jar 中的 sources 即为 classifier。
完整坐标示例:
<project>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<!-- name 标签仅用于展示,不参与坐标定位 -->
<name>Demo Project</name>
</project>为了清晰地表达版本变更的影响范围,业界广泛采用 SemVer 规范,格式为 X.Y.Z (主版本号。次版本号。补丁号)。
进阶格式:
预发布版本:1.0.0-alpha, 1.0.0-beta.1, 1.0.0-rc.1 (Release Candidate)。表示版本尚未稳定,仅供测试。
构建元数据:1.0.0+20230501。用于记录编译时间或提交哈希,不影响版本优先级。
在开发过程中,代码时刻在变化,频繁发布正式版(如 1.0.1, 1.0.2)既繁琐又不利于版本管理。Maven 引入了 SNAPSHOT 机制。
命名规则:在版本号后追加 -SNAPSHOT,例如 1.0.0-SNAPSHOT。
核心特性:
非稳定性:代表“开发中”的版本,随时可能变化。
动态更新:当你的项目依赖了一个 SNAPSHOT 版本的库时,Maven 在每次构建(默认每天一次,可配置为每次构建)时会检查远程仓库。如果远程仓库有更新的快照(即使版本号相同,内部时间戳不同),Maven 会自动下载最新代码。
覆盖机制:部署到私服时,新的 SNAPSHOT 包会覆盖旧的,始终保留最新状态。
使用场景:
多模块协作开发:模块 A 依赖模块 B,模块 B 正在频繁修改,此时模块 B 应发布为 SNAPSHOT 版本,以便模块 A 能实时获取最新改动。
禁止在生产环境(Production)中使用 SNAPSHOT 依赖,以确保构建的可重现性。
IDEA 原生支持 Maven,但在处理复杂的依赖冲突时略显吃力。安装 Maven Helper 插件可以极大提升效率。


打开 Settings -> Plugins。
在 Marketplace 中搜索 Maven Helper。
点击 Install 并重启 IDEA。
安装后,打开任意 pom.xml 文件,底部编辑器区域会多出一个 Dependency Analyzer 标签页。
可视化依赖树:
以图形化列表展示所有直接依赖和传递依赖。
支持搜索特定包,快速定位它被哪些库引入。
智能冲突检测:
痛点:当项目依赖了 A 库(依赖 X-1.0)和 B 库(依赖 X-2.0)时,Maven 会根据“最近原则”选择一个版本,可能导致运行时错误。
解决:插件会自动高亮显示冲突的依赖。你可以右键点击冲突项,选择 Exclude,一键在 pom.xml 中生成 <exclusion> 代码,无需手动编写复杂的 XML 结构。
依赖图:
提供直观的拓扑图,展示模块间的引用关系,帮助理解大型项目的架构。
快捷操作:
快速运行常用的 Maven 命令(如 clean install, dependency:tree)。
直接在 IDE 内查看插件详情和配置。
在 pom.xml 的 <dependency> 标签中,<scope> 元素决定了依赖包在项目的哪个阶段生效(编译、测试、运行、打包)。合理设置 Scope 可以减小最终包的体积,避免类冲突。
大多数业务依赖都使用此范围。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
<!-- scope 默认为 compile,可省略 -->
</dependency>开发 Web 项目时,我们需要 Servlet API 进行编译,但部署到 Tomcat 时,Tomcat 自身已经包含了 servlet-api.jar。如果我们的 WAR 包里也带一份,启动时会报错 ClassCastException 或版本冲突。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope> <!-- 关键:打包时不包含此 jar -->
</dependency>编写数据库代码时,我们只依赖 java.sql.Connection 接口(JDK 自带),不需要 MySQL 的具体实现类进行编译。但在程序运行时,必须加载 MySQL 驱动才能连接数据库。
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
<scope>runtime</scope> <!-- 编译不需要,运行和打包需要 -->
</dependency>JUnit 等测试框架只在执行 mvn test 时需要,打成的生产包(JAR/WAR)里不应该包含测试代码和测试框架,以减小体积。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope> <!-- 仅限测试阶段 -->
</dependency>