Skip to content

Maven 实战手册

导航目录

本文档基于 Maven 3.9.x 核心标准,深度整合了企业级开发中的构建管理、依赖治理、多模块架构、私服配置及自动化构建流程。旨在通过专业且通俗的语言,帮助开发者构建符合工业标准的 Java 工程化能力。


目录导航


1. Maven 环境管理与企业级配置

Maven 是一款为 Java 项目提供「自动化构建」与「依赖管理」的核心工具。它通过统一的项目结构和标准化的生命周期,彻底解决了传统开发中 Jar 包管理混乱、构建过程不可靠等痛点。

1.1 企业级核心价值

  • 依赖标准化:自动化处理 Jar 包的下载、版本锁定及冲突排除。
  • 构建一致性:一键执行编译、测试、打包,确保本地与服务器产物一致。
  • 模块解耦:支持分布式架构下的多模块聚合构建与代码复用。

1.2 企业级 settings.xml 深度配置

在企业开发中,通常需要配置私服(Nexus)以加速下载并共享内部组件。

  • 本地仓库配置
    xml
    <localRepository>D:\develop\maven_repo</localRepository>
  • 企业私服/镜像配置 (阿里云示例)
    xml
    <mirrors>
        <mirror>
            <id>alimaven</id>
            <name>aliyun maven</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <mirrorOf>central</mirrorOf>
        </mirror>
    </mirrors>
  • 统一编译环境 (JDK 21 示例)
    xml
    <profile>
        <id>jdk-21</id>
        <activation>
            <activeByDefault>true</activeByDefault>
            <jdk>21</jdk>
        </activation>
        <properties>
            <maven.compiler.source>21</maven.compiler.source>
            <maven.compiler.target>21</maven.compiler.target>
            <maven.compiler.compilerVersion>21</maven.compiler.compilerVersion>
        </properties>
    </profile>

2. 项目坐标与标准结构 (GAVP)

2.1 唯一身份标识

  • GroupId:组织/公司域名反写(如 com.alibaba.sourcing)。
  • ArtifactId:项目/模块名称(如 tc-order-service)。
  • Version:版本号。
    • SNAPSHOT:快照版(开发中,允许覆盖更新)。
    • RELEASE:稳定版(不可覆盖,生产环境首选)。
  • Packaging:打包格式(jarwar 或父工程专用的 pom)。

2.2 企业级项目结构

text
project-root
├── pom.xml                               # 全局父工程配置
├── src
│   ├── main
│   │   ├── java                          # 核心业务代码
│   │   └── resources                     # 环境配置文件 (properties/xml)
│   └── test
│       ├── java                          # 单元测试类 (JUnit)
│       └── resources                     # 测试资源
└── target                                # 构建产物 (忽略不提交)

3. 依赖管理与治理实战

3.1 依赖作用域 (Scope) 精讲

Scope 值编译 (main)测试 (test)运行/打包典型场景
compileYYY默认依赖 (如 Spring-Core)
test-Y-测试框架 (如 JUnit)
providedYY-容器已提供 (如 Servlet-API)
runtime-YY数据库驱动 (运行时动态加载)

3.2 依赖冲突解决原则

  1. 最短路径优先:A -> B -> C(1.0) 比 A -> C(2.0) 路径短,选用 2.0。
  2. 先声明优先:路径长度相同时,pom.xml 中排在前面的依赖胜出。
  3. 手动排除 (Exclusion):使用 <exclusions> 强制剔除冲突的传递依赖。

4. 构建生命周期与核心插件

4.1 构建命令全流程

  • mvn clean:清理构建缓存。
  • mvn compile:编译源码。
  • mvn test:执行单元测试并生成报告。
  • mvn package:生成 jar/war 文件。
  • mvn install:将产物推送到本地仓库。
  • mvn deploy:将产物推送到企业私服仓库。

4.2 企业级插件配置 (build)

xml
<build>
    <finalName>shop-api</finalName> <!-- 自定义打包名 -->
    <plugins>
        <!-- 指定编译 JDK 版本 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.11.0</version>
            <configuration>
                <source>21</source>
                <target>21</target>
            </configuration>
        </plugin>
    </plugins>
    <!-- 处理非标准目录下的资源文件 (如 MyBatis Mapper XML) -->
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes><include>**/*.xml</include></includes>
        </resource>
    </resources>
</build>

5. 多模块架构:继承与聚合

5.1 继承 (Inheritance) - 版本中心化

父工程(packaging: pom)通过 <dependencyManagement> 统一声明版本号,不直接引入 Jar 包。

xml
<!-- 父工程 pom.xml -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>6.0.6</version>
        </dependency>
    </dependencies>
</dependencyManagement>

5.2 聚合 (Aggregation) - 一键构建

在父工程中配置 <modules> 标签,实现多模块一键编译安装。

xml
<modules>
    <module>shop-common</module>
    <module>shop-service</module>
    <module>shop-web</module>
</modules>

6. 多环境配置管理 (Profiles)

企业级开发中需要区分 dev (开发)、test (测试) 和 prod (生产) 环境。

xml
<profiles>
    <profile>
        <id>dev</id>
        <activation><activeByDefault>true</activeByDefault></activation>
        <properties><env>dev</env></properties>
    </profile>
    <profile>
        <id>prod</id>
        <properties><env>prod</env></properties>
    </profile>
</profiles>

<!-- 构建时指定环境: mvn clean package -Pprod -->

7. 单元测试与质量控制 (JUnit 5)

7.1 测试实战

引入 junit-jupiter 并结合断言验证逻辑。

xml
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.9.1</version>
    <scope>test</scope>
</dependency>

7.2 核心断言与生命周期

  • 断言Assertions.assertEquals(expected, actual)
  • 钩子@BeforeEach (初始化资源)、@AfterAll (清理静态资源)。

8. 企业级最佳实践与避坑指南

  1. 依赖冲突检查:定期使用 mvn dependency:tree 查看依赖树,排查冗余 Jar。
  2. 避免循环依赖:如果 A 依赖 B,B 又依赖 A,说明项目划分不合理,需提取公共模块。
  3. 批量清理无效缓存:如果 IDEA 报红且无法下载,去本地仓库执行:
    bash
    del /s *.lastUpdated
  4. 命名规范
    • 模块名:全部小写,单词间用短横线 -(如 user-center)。
    • 坐标:groupId 与公司包名一致,artifactId 与模块名一致。
  5. 版本更新策略:子模块引用父工程声明的依赖时,绝对禁止写版本号,以防出现版本不一致导致运行时异常。