java-maven依赖管理

一、Maven认识

  1. Maven 概述

    • 定义:专为 Java 项目打造的标准化管理和构建工具。
    • 解决问题:简化依赖包管理、项目目录结构配置、环境配置及命令行编译等琐碎工作。
    • 核心功能:提供标准化项目结构、构建流程(编译、测试、打包、发布等)、依赖管理机制。
  2. Maven 项目结构

    • 标准目录

      • pom.xml:项目描述文件,位于根目录。
      • src/main/java:存放 Java 源码。
      • src/main/resources:存放主程序资源文件。
      • src/test/java:存放测试源码。
      • src/test/resources:存放测试资源文件。
      • target:存放编译、打包生成的文件。
    • 注意事项:需严格遵循标准目录结构,勿随意修改,以便 Maven 正常运行。

  3. pom.xml 文件解析

    • 项目坐标

      • groupId:类似 Java 包名,通常为公司或组织名称。
      • artifactId:类似 Java 类名,通常为项目名称。
      • version:项目版本号,三者组合唯一标识一个 Maven 工程。
    • 依赖声明:通过<dependency>标签声明依赖,Maven 自动下载依赖包并添加到 classpath,示例:

      xml

      <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-simple</artifactId>
          <version>2.0.16</version>
      </dependency>
      
    • 属性配置

      • project.build.sourceEncoding:设置源码字符编码,通常为UTF-8
      • maven.compiler.release:指定 JDK 版本(Java 9 + 推荐),确保源码和编译版本一致,若不一致可分别设置maven.compiler.sourcemaven.compiler.target
  4. Maven 安装步骤

    • 下载:从 [Maven 官网] 获取最新 3.9.x 版本。

    • 环境变量配置

      • Linux/macOS:解压后设置M2_HOME指向 Maven 目录,将$M2_HOME/bin添加到PATH
      • Windows:设置%M2_HOME%\bin到系统 Path 变量。
    • 验证安装:命令行输入mvn -version,若显示版本信息则安装成功,若提示命令未找到需检查环境变量配置。

  5. 总结

    • Maven 通过pom.xml定义项目,采用预设目录结构,简化依赖管理和构建流程。
    • 依赖通过groupIdartifactIdversion唯一定位,支持自动下载。
    • 标准化流程提升项目可维护性,适合团队协作和服务器部署

二、Maven 核心作用:自动化依赖管理

  1. 解决依赖痛点

    • 无需手动下载、解压第三方 Jar 包,自动处理传递依赖(如项目依赖abcabc依赖xyz,Maven 自动导入两者)。
    • 示例:声明spring-boot-starter-web依赖时,Maven 自动解析并导入其所需的二三十个间接依赖。
  2. 依赖传递图示

graph TD
Sample_Project --> abc --> xyz

1、依赖关系类型(Scope)

Scope说明典型示例
compile编译时需要(默认)commons-logging
test仅测试时需要,运行时无需引入JUnit
runtime编译时无需,运行时需要MySQL 驱动(mysql-connector-java)
provided编译时需要,但运行时由服务器或 JDK 提供(如 Servlet 容器内置)jakarta.servlet-api

配置示例

<!-- test作用域 -->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.3.2</version>
    <scope>test</scope>
</dependency>

2、Maven 仓库管理

  1. 中央仓库(Central Repository)

    • 官方仓库地址:repo1.maven.org
    • 首次下载 Jar 包后缓存在本地(用户主目录.m2目录),后续直接使用缓存,无需重复下载。
  2. 镜像仓库(Mirror Repository)

    • 作用:加速下载(如国内用户使用阿里云镜像)。

    • 配置方法:在.m2/settings.xml中添加镜像配置:

      <settings>
          <mirrors>
              <mirror>
                  <id>aliyun</id>
                  <name>aliyun</name>
                  <mirrorOf>central</mirrorOf>
                  <url>https://maven.aliyun.com/repository/central</url>
              </mirror>
          </mirrors>
      </settings>
      

3、依赖唯一标识:groupId:artifactId:version

  • 三要素

    • groupId:组织名称(如org.springframework.boot)。
    • artifactId:组件名称(如spring-boot-starter-web)。
    • version:版本号(如1.4.2.RELEASE)。
  • 注意

    • -SNAPSHOT结尾的版本为开发版,每次都会重新下载,仅用于私有仓库。
    • 公开发布版本不可包含SNAPSHOT

4、第三方组件搜索

  • 官网:search.maven.org
  • 操作:搜索关键字(如okhttp),获取groupId:artifactId:version后直接复制使用。

5、Maven 使用方式

  1. 命令行编译

    • 进入pom.xml所在目录,执行:

      mvn clean package  # 清理并打包,结果存于target目录
      
  2. IDE 集成(以 Eclipse 为例)

    • 直接创建 / 导入 Maven 项目。
    • 若项目报错,右键选择 Maven - Update Project 更新依赖。

三、Maven 构建流程核心内容

  1. 关键概念

    • 生命周期(Lifecycle)
      Maven 预定义的标准化流程,由一系列阶段(Phase)组成。

      • default 生命周期:处理项目部署,常见阶段包括validate(验证)、compile(编译)、test(测试)、package(打包)、install(安装到本地仓库)、deploy(部署到远程仓库)。
      • clean 生命周期:清理构建产物,包含pre - clean(预处理清理)、clean(清理)、post - clean(后续清理)阶段。
    • 阶段(Phase)
      生命周期中的具体步骤,执行某个 Phase 会按顺序触发其前所有 Phase。例如:

      • mvn package:执行 default 生命周期,从validatepackage的所有阶段。
      • mvn clean package:先执行 clean 生命周期的clean阶段,再执行 default 的package阶段。
    • 目标(Goal)
      具体的任务单元,与 Phase 绑定,命名格式为插件:任务(如compiler:compile)。执行 Phase 时会触发默认绑定的 Goal,少数场景需直接指定 Goal(如mvn tomcat:run启动 Tomcat)。

  2. 常用命令示例

    命令说明
    mvn clean执行 clean 生命周期的clean阶段,清理构建产物
    mvn clean compile先清理,再执行到compile阶段(编译源代码)
    mvn clean test先清理,再执行到test阶段(运行测试,自动触发编译)
    mvn clean package先清理,再执行到package阶段(打包为 JAR/WAR)
  3. 类比说明

    • Lifecycle → Java 的package(包含一组相关 Phase)。
    • Phase → Java 的class(包含具体任务 Goal)。
    • Goal → Java 的method(实际执行的操作)。

四、Maven 插件核心内容

1. Maven 插件基础概念

  • 核心逻辑:Maven 通过 “生命周期(lifecycle)” 和 “阶段(phase)” 管理构建流程,每个 phase 依赖插件的 “目标(goal)” 实现具体功能。

    • 例:执行mvn compile时,Maven 调用compiler插件的compiler:compile goal 完成编译。
  • 插件分类

    • 内置标准插件:无需声明即可使用,预定义了 phase 与 goal 的映射关系。

      插件名称对应 phase功能描述
      cleanclean清理构建输出
      compilercompile编译 Java 源码
      surefiretest运行单元测试
      jarpackage打包为 JAR 文件
    • 自定义插件:需在pom.xml中声明依赖,配置插件的 groupId、artifactId、version 及执行阶段(phase)和目标(goal)。

2. 自定义插件配置示例

maven-shade-plugin(用于生成可执行 JAR)为例:

<project>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.2.1</version>
        <executions>
          <execution>
            <phase>package</phase> <!-- 绑定到package阶段 -->
            <goals>
              <goal>shade</goal> <!-- 执行shade目标 -->
            </goals>
            <configuration>
              <!-- 配置插件参数:指定主类 -->
              <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                  <mainClass>com.itranswarp.learnjava.Main</mainClass>
                </transformer>
              </transformers>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

3. 常用自定义插件列表

插件名称功能描述
maven-shade-plugin打包所有依赖并生成可执行 JAR
cobertura-maven-plugin生成单元测试覆盖率报告
findbugs-maven-plugin静态分析代码,查找潜在问题

4. 关键要点总结

  • 插件是 Maven 实现构建功能的核心,通过 phase 触发执行。
  • 内置插件无需声明,自定义插件必须在pom.xml中声明依赖和配置。
  • 插件配置需参考官方文档,重点关注 phase 绑定、goal 定义及参数设置(如主类、输出路径等)。

五、模块管理

  1. 模块拆分目的:将大项目拆分为多个模块(如 Module A、B、C),降低软件复杂度,每个模块为独立 Maven 项目,有各自的pom.xml

  2. 父模块(parent)作用

    • 提取公共配置:定义子模块的公共配置,如groupIdversion、依赖(slf4j-apilogback-classicjunit等)、编码格式、Java 版本等。
    • 特殊配置packagingpom,不含 Java 代码,仅用于配置继承。
  3. 子模块继承方式

    • 简化配置:子模块(如模块 A、B、C)通过<parent>标签声明父模块,仅需定义自身唯一的artifactId,其余配置自动继承父模块。
    • 覆盖配置:若有特殊需求,可在子模块pom.xml中显式覆盖父模块配置(如修改依赖版本)。
  4. 模块依赖管理:若模块 A 依赖模块 B,需在模块 A 的pom.xml中通过<dependencies>引入模块 B 的坐标(groupIdartifactIdversion)。

  5. 根模块(build)作用

    • 统一编译:在根目录创建pom.xml,通过<modules>标签列出所有子模块(包括 parent),执行mvn clean package时按依赖顺序一次性编译所有模块。
    • 配置示例:根模块pom.xml包含groupIdartifactIdversionpackagingpom,并声明<modules>列表。
  6. Maven 仓库类型

    • 中央仓库:第三方模块开发者发布 jar 包的公共仓库,如commons logginglog4j等依赖可直接引用。
    • 私有仓库:公司内部搭建的仓库,用于存储不公开的源码和 jar 包,通过本地~/.m2/settings.xml配置,使用方式与中央仓库一致。
    • 本地仓库:本地开发项目的 “发布” 仓库,但不推荐将自研模块安装至此,因修改后需重新安装,易导致版本不一致,建议使用模块化编译管理依赖。