Maven 常见考题

1. 基础概念

Q: Maven的核心概念是什么?

A: Maven的三大核心概念:

  • 坐标系统: groupId, artifactId, version 唯一标识项目
  • 生命周期: validate → compile → test → package → install → deploy
  • 依赖管理: 自动管理项目依赖,解决传递依赖和版本冲突

Q: Maven的优势是什么?

A:

  • 标准化项目结构
  • 自动依赖管理
  • 丰富的插件生态
  • 与IDE集成良好
  • 支持多模块项目

2. POM文件

Q: 解释POM文件的作用和核心元素

A: POM (Project Object Model) 是Maven项目的核心配置文件

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>     <!-- 组织标识 -->
    <artifactId>demo</artifactId>      <!-- 项目名称 -->
    <version>1.0.0</version>           <!-- 版本号 -->
    <packaging>jar</packaging>         <!-- 打包方式 -->
    
    <properties>
        <java.version>21</java.version>
    </properties>
    
    <dependencies>
        <!-- 依赖声明 -->
    </dependencies>
    
    <build>
        <plugins>
            <!-- 插件配置 -->
        </plugins>
    </build>
</project>

Q: 什么是父POM?

A: 父POM用于统一管理多个子项目的公共配置

  • 统一版本管理
  • 共享依赖配置
  • 统一插件配置

3. 依赖管理

Q: Maven依赖范围(scope)有哪些?

A:

  • compile - 默认范围,编译和运行时都需要
  • test - 仅测试时需要 (如JUnit)
  • provided - 编译时需要,运行时由容器提供 (如Servlet API)
  • runtime - 运行时需要,编译时不需要 (如数据库驱动)
  • system - 系统依赖,需要显式指定路径
  • import - 仅用于dependencyManagement中导入BOM

Q: 如何解决依赖冲突?

A:

  1. 排除依赖:
<dependency>
    <groupId>org.example</groupId>
    <artifactId>conflict-lib</artifactId>
    <version>2.0</version>
    <exclusions>
        <exclusion>
            <groupId>old.lib</groupId>
            <artifactId>old-version</artifactId>
        </exclusion>
    </exclusions>
</dependency>
  1. 使用dependencyManagement统一版本
  2. Maven遵循"最短路径优先"和"声明顺序优先"原则

Q: 什么是传递依赖?

A: 当项目依赖A,而A又依赖B时,B就是传递依赖。Maven会自动引入传递依赖。

4. 生命周期

Q: Maven有哪些生命周期?

A: Maven有三个独立的生命周期:

  1. Default生命周期 (构建项目):

    • validate → compile → test → package → install → deploy
  2. Clean生命周期 (清理项目):

    • pre-clean → clean → post-clean
  3. Site生命周期 (生成文档):

    • pre-site → site → post-site → site-deploy

Q: 常用的生命周期阶段?

A:

  • compile - 编译源代码
  • test - 运行单元测试
  • package - 打包成jar/war
  • install - 安装到本地仓库
  • deploy - 部署到远程仓库

5. 插件

Q: 常用Maven插件有哪些?

A:

  • maven-compiler-plugin - 编译插件
  • maven-surefire-plugin - 单元测试插件
  • maven-failsafe-plugin - 集成测试插件
  • spring-boot-maven-plugin - Spring Boot插件
  • maven-shade-plugin - 打包插件

Q: 如何配置插件?

A:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.13.0</version>
            <configuration>
                <source>21</source>
                <target>21</target>
            </configuration>
        </plugin>
    </plugins>
</build>

6. 仓库

Q: Maven仓库有哪些类型?

A:

  • 本地仓库: ~/.m2/repository
  • 中央仓库: Maven官方仓库
  • 私有仓库: 企业内部仓库 (如Nexus)

Q: 仓库查找顺序?

A: 本地仓库 → 私有仓库 → 中央仓库

7. 多模块项目

Q: 如何创建多模块项目?

A:

<!-- 父项目pom.xml -->
<packaging>pom</packaging>
<modules>
    <module>module-a</module>
    <module>module-b</module>
</modules>

<!-- 子模块pom.xml -->
<parent>
    <groupId>com.example</groupId>
    <artifactId>parent</artifactId>
    <version>1.0.0</version>
</parent>

8. 命令行

Q: 常用Maven命令?

A:

mvn clean                    # 清理
mvn compile                  # 编译
mvn test                     # 测试
mvn package                  # 打包
mvn install                  # 安装到本地仓库
mvn deploy                   # 部署到远程仓库
mvn clean install           # 清理并安装
mvn dependency:tree         # 查看依赖树
mvn help:effective-pom      # 查看有效POM

9. 配置文件

Q: Maven配置文件有哪些?

A:

  • pom.xml - 项目配置
  • settings.xml - 用户/全局设置
  • maven-wrapper.properties - Wrapper配置

Q: settings.xml的作用?

A:

  • 配置本地仓库路径
  • 配置镜像仓库
  • 配置服务器认证信息
  • 配置代理设置

10. 实际问题

Q: 如何跳过测试?

A:

mvn package -DskipTests        # 跳过测试执行
mvn package -Dmaven.test.skip=true  # 跳过测试编译和执行

Q: 如何指定JDK版本?

A:

<properties>
    <maven.compiler.source>21</maven.compiler.source>
    <maven.compiler.target>21</maven.compiler.target>
</properties>

Q: Maven Wrapper的优势?

A:

  • 无需本地安装Maven
  • 版本锁定,团队一致
  • 项目自包含
  • 零配置启动

11. 性能优化

Q: 如何提高Maven构建速度?

A:

  • 使用并行构建: mvn -T 4 clean install
  • 离线模式: mvn -o package
  • 跳过不必要的阶段
  • 使用本地镜像仓库
  • 合理配置内存: MAVEN_OPTS=-Xmx1024m

12. 故障排除

Q: 常见Maven问题及解决方案?

A:

  • 依赖下载失败: 检查网络、清理本地仓库
  • 版本冲突: 使用dependency:tree分析,排除冲突依赖
  • 编译失败: 检查JDK版本、编码格式
  • 内存不足: 增加MAVEN_OPTS内存配置