maven详解

Maven 是一个广泛使用的自动化构建工具,主要用于 Java 项目的构建、依赖管理和项目信息管理。它由 Apache 软件基金会维护,旨在简化 Java 项目的开发流程,提高开发效率,并促进团队协作。Maven 的核心是 项目对象模型(Project Object Model, POM)。POM 是一个 XML 文件(pom.xml),用于描述项目的结构、依赖、插件配置等。每个 Maven 项目都有一个唯一的 pom.xml 文件,它定义了项目的元数据,如项目名称、版本、开发者信息等。

一.Maven的核心概念说明

1.1.Maven 的核心功能

  • 依赖管理:自动下载和管理项目所需的第三方库(JAR 文件)。
  • 生命周期管理:提供标准化的构建流程,包括编译、测试、打包、部署等阶段。
  • 插件管理:通过插件扩展 Maven 的功能,支持各种构建任务,如代码生成、文档生成、测试等。
  • 项目结构管理:提供标准化的目录结构,使项目结构清晰、易于维护。

1.2. Maven 的生命周期

Maven 的三个标准生命周期,这三套生命周期完全独立,互补影响,下面是详细解释。

  • default:用于构建项目,包括编译、测试、打包、安装和部署等
    • validate:验证项目配置。
    • initialize:初始化构建环境。
    • generate-sources:生成源代码。
    • process-sources:处理源代码。
    • generate-resources:生成资源文件。
    • process-resources:处理资源文件。
    • compile:编译源代码。
    • test-compile:编译测试代码。
    • test:运行单元测试。
    • package:打包项目。
    • install:将打包后的项目安装到本地仓库。
    • deploy:将项目部署到远程仓库。
  • clean:用于清理项目,删除上一次构建生成的文件。
    • pre-clean:执行一些清理前需要完成的工作。
    • clean:清理上一次构建生成的文件(默认删除 target 目录)。
    • post-clean:执行一些清理后需要完成的工作
  • site:用于生成项目站点文档。
    • pre-site:执行一些生成站点前需要完成的工作。
    • site:生成项目站点文档。
    • post-site:执行一些生成站点后需要完成的工作。
    • site-deploy:将生成的站点文档部署到远程服务器。

1.3. Maven 的插件系统

Maven 的插件系统是其强大的功能之一,在 Maven 的构建体系中,插件(Plugin)是实现各种构建任务的核心机制。每个插件可以包含一个或多个目标(Goal),而这些目标又可以绑定到Maven 生命周期的某个阶段上,从而实现自动化构建、测试、打包、部署等功能。Maven 有三个标准生命周期:default、clean 和 site,它们各自包含一系列预定义的阶段(Phase)。插件的目标可以通过 <executions> 配置绑定到这些阶段上,控制其执行时机。下面列出了一个常用的插件。

插件名称 作用 目标(Goal) 绑定阶段
maven-clean-plugin 清理项目,删除上一次构建生成的文件(如 target 目录) clean clean
maven-compiler-plugin 编译 Java 源代码 compile compile
maven-surefire-plugin 运行单元测试 test test
maven-jar-plugin 打包为 JAR 文件 jar package
maven-war-plugin 打包为 WAR 文件 war package
maven-deploy-plugin 将项目部署到远程仓库 deploy deploy
maven-install-plugin 将项目安装到本地仓库 install install
maven-source-plugin 打包源代码 jar-no-fork verify
maven-resources-plugin 处理资源文件 resources process-resources
maven-test-resources-plugin 处理测试资源文件 testResources process-test-resources
maven-site-plugin 生成项目站点文档 site site
maven-javadoc-plugin 生成 Javadoc 报告 generate any
maven-assembly-plugin 打包为自定义格式(如 ZIP、TAR) single any
maven-antrun-plugin 执行 Ant 任务 run any
maven-dependency-plugin 管理依赖 list, tree, analyze any
maven-release-plugin 管理版本发布 release:prepare, release:perform deploy
maven-remote-resources-plugin 共享和同步资源 remote-resources:process generate-resources
sql-maven-plugin 执行 SQL 脚本 execute initialize
taglist-maven-plugin 生成源代码中的标签列表报告 taglist site
versions-maven-plugin 检查和更新依赖版本 display-dependency-updates, use-latest-versions validate

插件的使用方式如下:

复制代码
mvn [plugin-name]:[goal-name]

1.4. Maven 的仓库管理

Maven 使用 仓库 来存储和检索项目依赖。Maven 有以下几种类型的仓库:

  • 本地仓库:存储项目依赖的本地目录,通常位于 \~/.m2/repository
  • 远程仓库:如 Maven Central,存储公共的 JAR 文件。
  • 私有仓库:公司内部的 JAR 文件仓库,可以通过 Nexus 或 Artifactory 等工具管理。

Maven 的 settings.xml 文件可以配置仓库地址,例如:

XML 复制代码
<!--项目级别配置pom.xml,通常不推荐使用,除非有特别需求
定义项目所需的远程仓库地址(覆盖或补充默认仓库)-->
<repositories>
    <repository>
        <id>central</id>
        <url>https://repo.maven.apache.org/maven2</url>
    </repository>
</repositories>

<!--全局配置,settings.xml -->
<mirror>
      <id>alimaven</id>
      <mirrorOf>central</mirrorOf>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>

1.5. Maven 的高级功能

Maven 提供了多种高级功能,帮助开发者更高效地管理项目:

  • 聚合(Aggregation) :将多个子项目合并为一个父项目,统一管理。
XML 复制代码
<!-- 父项目pom.xml -->
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>xman-parent</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>  <!-- 聚合:必须为pom类型 -->
    
    <modules>
        <module>ruoyi-business</module>  <!-- 子模块1 -->
        <module>ruoyi-common</module>    <!-- 子模块2 -->
    </modules>
</project>
  • 继承(Inheritance) :子项目继承父项目的配置,减少重复配置。
XML 复制代码
<!-- 子模块ruoyi-business/pom.xml -->
<project>
<!-- 父模块 -->
    <parent>
        <groupId>com.example</groupId>
        <artifactId>xman-parent</artifactId>
        <version>1.0.0</version>
    </parent>
    
    <artifactId>ruoyi-business</artifactId>
    
    <!-- 自动继承父POM的依赖/插件配置 -->
    <dependencies>
        <!-- 子模块特有依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!-- 版本由父POM的dependencyManagement控制 -->
        </dependency>
    </dependencies>
</project>
  • 依赖冲突解决:当多个依赖版本冲突时,Maven 会根据优先级规则(如 First Declaration Principle 或 Path Nearest Principle)选择合适的依赖。
  • 插件配置:在 pom.xml 中详细配置插件,支持自定义插件目标和执行顺序。

1.6. Maven 的优势与局限性

Maven 的优势包括:

  • 标准化的项目结构:简化了项目管理,提高了团队协作效率。
  • 强大的依赖管理:自动下载和管理依赖,减少手动配置。
  • 插件系统:支持丰富的插件,扩展性强。
  • 生命周期管理:提供标准化的构建流程,提高开发效率。

Maven 的局限性包括:

  • 学习曲线:对于新手来说,需要一定时间学习和掌握。
  • 配置复杂:虽然默认配置简单,但高级功能需要详细配置。
  • 版本冲突:在某些情况下,依赖冲突可能影响项目稳定性。

二.

二. Maven 的项目结构

Maven 项目通常遵循以下标准目录结构:

  • src/main/java:存放主源代码。
  • src/test/java:存放测试代码。
  • src/main/resources:存放资源文件(如配置文件、图片等)。
  • src/test/resources:存放测试资源文件。
  • target:存放构建输出(如编译后的类文件、打包后的 JAR/WAR 文件)。
  • pom.xml:项目配置文件,定义项目依赖、插件、生命周期等。

三.Maven 的依赖管理

Maven 通过 pom.xml 文件中的 <dependencies> 标签管理项目依赖。开发者只需声明所需的依赖项,Maven 会自动从远程仓库(如 Maven Central)下载所需的 JAR 文件。例如:

复制代码
<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.32</version>
    </dependency>
</dependencies>

四.Maven依赖的版本管理

Maven 支持依赖的版本管理,可以通过 <dependencyManagement> 标签锁定依赖版本,确保项目的一致性。

1.父模块POM配置

XML 复制代码
<!-- 父项目pom.xml -->
<project>
    <!-- ... 父项目锁定版本 ... -->
    
    <dependencyManagement>
        <dependencies>
            <!-- Spring Boot Starter 全家桶 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>3.4.2</version>
            </dependency>
            
            <!-- MyBatis Plus -->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>3.5.10</version>
            </dependency>
            
            <!-- 第三方工具 -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>easyexcel</artifactId>
                <version>3.3.2</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

2.子模块引用(无需版本)

XML 复制代码
<!-- 子模块pom.xml -->
<dependencies>
    <!-- 自动继承父POM中定义的版本 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <!-- 可覆盖父POM的版本(不推荐) -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.4.0</version> <!-- 特殊版本需求时使用 -->
    </dependency>
</dependencies>

3.版本变量集中管理

XML 复制代码
<properties>
    <spring-boot.version>3.4.2</spring-boot.version>
    <mybatis-plus.version>3.5.10</mybatis-plus.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>${spring-boot.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

4. BOM导入(推荐)

导入Spring Boot BOM必须用<dependencyManagement>

XML 复制代码
<!-- 直接导入Spring Boot官方BOM -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>3.4.2</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

5.效果对比

|---------|-----------------------|------------------------|
| 场景 | 无dependencyManagement | 使用dependencyManagement |
| 多模块版本同步 | 各子模块需单独指定版本 | 父POM统一控制 |
| 升级框架版本 | 需修改所有子模块pom.xml | 仅修改父POM一处 |
| 冲突解决 | 容易因传递依赖导致版本冲突 | 明确指定版本,冲突概率降低 |

五.maven命令介绍

1.核心生命周期命令

  • mvn clean:删除target目录(清理编译产物)。
  • mvn compile:编译主代码(生成target/classes)。
  • mvn test:运行单元测试(需src/test/java有测试类)。
  • mvn package:打包(生成jar/war到target/)。
  • mvn install:安装到本地仓库(供其他模块依赖)。
  • mvn deploy:部署到远程仓库(需配置distributionManagement)。

2. 多模块操作

  • -pl(指定模块)
bash 复制代码
  mvn -pl web-admin clean install  # 仅对web-admin模块执行clean和install 
  • -am(连带依赖模块)
bash 复制代码
  mvn -am -pl web-admin install    # 处理web-admin及其依赖模块
  • -rf(从指定模块继续执行)
bash 复制代码
  mvn -rf web-common compile       # 从web-common模块开始编译

3. 参数详解

  • -D(定义系统属性)
bash 复制代码
  mvn test -Dtest=MyTestClass        # 运行指定测试类
  mvn install -DskipTests            # 跳过测试
  • -P(激活Profile)
bash 复制代码
  mvn test -Dtest=MyTestClass        # 运行指定测试类
  mvn install -DskipTests            # 跳过测试
  • -U(强制更新依赖)
bash 复制代码
  mvn clean install -U               # 强制更新远程仓库索引

4. 依赖与插件管理

  • 依赖树分析
bash 复制代码
  mvn dependency:tree -Dverbose      # 显示完整的依赖树(含冲突)
  • 插件目标查询
bash 复制代码
  mvn help:describe -Dplugin=org.apache.maven.plugins:maven-compiler-plugin -Ddetail

5. 常见组合命令

  • 清理并重新构建
bash 复制代码
   mvn clean package -DskipTests
  • 仅部署指定模块
bash 复制代码
   mvn -pl web-admin deploy
  • 多模块并行构建
bash 复制代码
   mvn -T 4 clean install            # 使用4线程并行构建

6.注意事项

  • 模块路径:需在项目根目录(含pom.xml)执行命令。
  • 参数顺序:-D参数通常放在命令末尾。
  • 环境隔离:通过-P切换不同环境的配置(如dev/prod)。
  • 如果需要更具体的场景示例或某个命令的深入解释,可以进一步说明!
相关推荐
ChinaRainbowSea6 分钟前
补充:问题:CORS ,前后端访问跨域问题
java·spring boot·后端·spring
KiddoStone16 分钟前
多实例schedule job同步数据流的数据一致性设计和实现方案
java
岁忧37 分钟前
(LeetCode 每日一题) 1865. 找出和为指定值的下标对 (哈希表)
java·c++·算法·leetcode·go·散列表
YuTaoShao40 分钟前
【LeetCode 热题 100】240. 搜索二维矩阵 II——排除法
java·算法·leetcode
考虑考虑2 小时前
JDK9中的dropWhile
java·后端·java ee
想躺平的咸鱼干2 小时前
Volatile解决指令重排和单例模式
java·开发语言·单例模式·线程·并发编程
hqxstudying2 小时前
java依赖注入方法
java·spring·log4j·ioc·依赖
·云扬·2 小时前
【Java源码阅读系列37】深度解读Java BufferedReader 源码
java·开发语言
Bug退退退1233 小时前
RabbitMQ 高级特性之重试机制
java·分布式·spring·rabbitmq
小皮侠3 小时前
nginx的使用
java·运维·服务器·前端·git·nginx·github