Skip to content

Maven 最佳实践

12.1 项目结构规范

12.1.1 遵循标准目录结构

Maven 定义了一套标准的项目目录结构,应该严格遵循:

project/
├── pom.xml
├── src/
│   ├── main/
│   │   ├── java/        # 主源代码目录
│   │   ├── resources/   # 主资源文件目录
│   │   └── webapp/      # Web 项目的 Web 资源目录
│   └── test/
│       ├── java/        # 测试源代码目录
│       └── resources/   # 测试资源文件目录
└── target/              # 构建输出目录

12.1.2 包结构规范

  • groupId:使用反向域名,如 com.example
  • artifactId:使用小写字母和连字符,如 my-project
  • 包名:使用反向域名,如 com.example.myproject

12.1.3 命名规范

  • 文件命名:使用驼峰命名法,如 UserService.java
  • 目录命名:使用小写字母和连字符,如 src/main/java/com/example/myproject/service
  • 版本号:使用语义化版本号,如 1.0.01.0.1-SNAPSHOT

12.2 POM 文件组织

12.2.1 基础配置

  • 最小化 POM:只包含必要的配置,避免冗余
  • 使用属性:使用 <properties> 元素定义版本号和其他常量
  • 统一依赖管理:在父 POM 中使用 <dependencyManagement> 统一管理依赖版本

示例

xml
<properties>
  <spring.version>5.3.20</spring.version>
  <junit.version>4.13.2</junit.version>
  <java.version>11</java.version>
</properties>

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!-- 其他依赖 -->
  </dependencies>
</dependencyManagement>

12.2.2 插件配置

  • 显式指定插件版本:避免使用默认版本,确保构建的一致性
  • 使用 pluginManagement:在父 POM 中使用 <pluginManagement> 统一管理插件版本
  • 配置编译插件:明确指定 Java 版本

示例

xml
<build>
  <pluginManagement>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <source>${java.version}</source>
          <target>${java.version}</target>
        </configuration>
      </plugin>
      <!-- 其他插件 -->
    </plugins>
  </pluginManagement>
</build>

12.3 依赖管理策略

12.3.1 依赖版本管理

  • 使用属性:使用 <properties> 元素定义依赖版本
  • 使用 dependencyManagement:在父 POM 中统一管理依赖版本
  • 避免版本冲突:使用 mvn dependency:tree 检查依赖冲突

12.3.2 依赖范围管理

  • 正确使用依赖范围:根据依赖的用途选择合适的范围
  • 避免使用 compile 范围:对于只在测试或运行时使用的依赖,使用相应的范围

12.3.3 依赖清理

  • 定期检查依赖:使用 mvn dependency:analyze 检查未使用的依赖
  • 移除不必要的依赖:及时移除项目中不需要的依赖

12.4 版本管理策略

12.4.1 版本号规范

  • 语义化版本号:使用 MAJOR.MINOR.PATCH 格式,如 1.0.0
  • 快照版本:使用 -SNAPSHOT 后缀表示开发中的版本,如 1.0.0-SNAPSHOT
  • 发布版本:使用正式版本号,如 1.0.01.0.1

12.4.2 版本管理流程

  1. 开发阶段:使用快照版本,如 1.0.0-SNAPSHOT
  2. 测试阶段:使用测试版本,如 1.0.0-RC1
  3. 发布阶段:使用正式版本,如 1.0.0
  4. 维护阶段:使用补丁版本,如 1.0.1

12.4.3 版本控制

  • 使用版本控制工具:如 Git、SVN 等
  • 标签管理:为每个发布版本创建标签
  • 分支管理:使用分支管理不同版本的开发

12.5 构建优化

12.5.1 构建速度优化

  • 配置镜像:使用国内镜像,如阿里云镜像
  • 启用并行构建:使用 -T 选项启用并行构建
  • 跳过测试:在开发阶段使用 -DskipTests 跳过测试
  • 使用增量构建:只构建修改过的文件

12.5.2 构建缓存

  • 使用本地仓库:确保本地仓库中有所有依赖
  • 清理本地仓库:定期清理本地仓库,删除过期的依赖
  • 使用构建缓存:启用 Maven 的构建缓存功能

12.5.3 构建输出管理

  • 配置输出目录:使用 <outputDirectory> 元素配置输出目录
  • 配置最终名称:使用 <finalName> 元素配置最终名称
  • 管理构建产物:合理管理构建产物,避免冗余

12.6 团队协作规范

12.6.1 代码规范

  • 统一代码风格:使用代码风格检查工具,如 Checkstyle
  • 代码审查:定期进行代码审查
  • 提交规范:使用统一的提交消息格式

12.6.2 构建规范

  • 统一构建环境:确保团队成员使用相同的 Maven 版本
  • 统一配置文件:使用版本控制管理配置文件
  • 构建脚本:使用构建脚本统一构建过程

12.6.3 依赖管理规范

  • 依赖审批:建立依赖审批流程
  • 依赖版本锁定:锁定依赖版本,确保构建的一致性
  • 依赖安全检查:定期检查依赖的安全漏洞

12.6.4 文档规范

  • 项目文档:维护项目文档,包括架构设计、API 文档等
  • 构建文档:维护构建文档,包括构建过程、依赖管理等
  • 部署文档:维护部署文档,包括部署步骤、环境配置等

通过遵循这些最佳实践,可以提高项目的可维护性、可扩展性和构建效率,确保团队协作的顺畅。