Maven全网最细学习手册(上篇)

Maven(全网最详细教程) Maven简介与核心功能 Maven是一款跨平台的项目管理工具,基于POM模型标准化项目构建流程。其核心功能包括: 一键构建:通过简单命令完成编译、测试、打包等全流程 依赖管理:通过坐标系统从中央仓库/本地仓库自动获取JAR包,避免传统项目直接引入JAR的资源浪费 工程聚合:支持将大项目拆分为多个子模块(POM/JAR/WAR),提高代码复用率 关键特性 依赖调解机制:最短路径优先和最先声明原则解决版本冲突 生命周期管理:定义validate-compile-test-package-install-dep 阅读详情

🚀 Maven 全网最细学习手册(上篇)

💡 基础到进阶:掌握Maven核心概念、POM配置、生命周期与插件,为企业级开发打下坚实基础!

📖 学习导航

  • 🎯 适合人群:Java开发初学者、想深入学习Maven的开发者
  • ⏱️ 学习时长:建议3-4天完成上篇内容
  • 🎓 学习目标:掌握Maven核心概念、熟练配置POM文件、理解生命周期和插件机制
  • 📚 学习方式:理论+实践,每个知识点都有详细示例

📚 系列文章导航

  • 📖 上篇:基础概念 + POM配置 + 生命周期与插件
  • 📖 下篇:高级应用 + 多模块项目 + 实战案例 + 最佳实践

📌 第一阶段:Maven 基础概念与环境搭建

🎯 1. Maven 是什么?深度解析

1.1 Maven 的核心作用

Maven(意为"专家"、“内行”)是Apache软件基金会的一个项目管理和构建自动化工具,主要用于Java项目。

🔧 三大核心功能:

  1. 依赖管理:自动下载和管理项目所需的第三方库
  2. 项目构建:编译、测试、打包、部署的自动化流程
  3. 项目标准化:统一的项目结构和构建流程
1.2 Maven vs. 其他构建工具对比
特性MavenAntGradle
配置方式XML声明式XML过程式Groovy/Kotlin DSL
依赖管理✅ 内置强大❌ 需要手动✅ 内置强大
学习曲线中等简单较陡
构建速度中等快最快
生态系统最成熟较少快速发展
企业采用最广泛逐渐减少快速增长
1.3 Maven 的核心思想

🎯 约定优于配置(Convention over Configuration)

  • 标准化的目录结构
  • 预定义的构建生命周期
  • 默认的插件配置
  • 统一的依赖管理方式

💡 好处:

  • 减少配置工作量
  • 提高项目的可维护性
  • 团队协作更加高效
  • 降低学习成本

🛠️ 2. Maven 安装与配置详解

2.1 下载和安装 Maven

📥 下载步骤:

  1. 访问官网:https://maven.apache.org/download.cgi
  2. 选择最新稳定版本(推荐3.8.x或3.9.x)
  3. 下载二进制包:apache-maven-3.9.5-bin.zip

💻 Windows 安装:

# 1. 解压到指定目录(建议无中文路径)
C:\Program Files\Apache\maven\apache-maven-3.9.5

# 2. 配置环境变量
MAVEN_HOME = C:\Program Files\Apache\maven\apache-maven-3.9.5
PATH = %PATH%;%MAVEN_HOME%\bin

# 3. 验证安装
mvn -version

🐧 Linux/Mac 安装:

# 1. 解压
tar -xzf apache-maven-3.9.5-bin.tar.gz
sudo mv apache-maven-3.9.5 /opt/maven

# 2. 配置环境变量(~/.bashrc 或 ~/.zshrc)
export MAVEN_HOME=/opt/maven
export PATH=$PATH:$MAVEN_HOME/bin

# 3. 重新加载配置
source ~/.bashrc

# 4. 验证安装
mvn -version

✅ 安装成功标志:

Apache Maven 3.9.5 (57804ffe001d7215b5e7bcb531cf83df38f93546)
Maven home: /opt/maven
Java version: 11.0.16, vendor: Eclipse Adoptium
Java home: /usr/lib/jvm/temurin-11-jdk-amd64
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "5.4.0-74-generic", arch: "amd64", family: "unix"
2.2 配置 Maven 本地仓库

📁 默认仓库位置:

  • Windows: C:\Users\{用户名}\.m2\repository
  • Linux/Mac: ~/.m2/repository

🔧 自定义仓库位置(settings.xml):

步骤1:找到settings.xml文件

# Maven安装目录下的全局配置
{MAVEN_HOME}/conf/settings.xml

# 用户目录下的个人配置(优先级更高)
~/.m2/settings.xml

步骤2:配置本地仓库

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 
          http://maven.apache.org/xsd/settings-1.0.0.xsd">
  
  <!-- 本地仓库路径 -->
  <localRepository>D:\maven\repository</localRepository>
  
  <!-- 离线模式 -->
  <offline>false</offline>
  
  <!-- 插件组 -->
  <pluginGroups>
    <pluginGroup>org.apache.maven.plugins</pluginGroup>
    <pluginGroup>org.codehaus.mojo</pluginGroup>
  </pluginGroups>
  
  <!-- 镜像配置(加速下载) -->
  <mirrors>
    <!-- 阿里云镜像 -->
    <mirror>
      <id>aliyunmaven</id>
      <mirrorOf>*</mirrorOf>
      <name>阿里云公共仓库</name>
      <url>https://maven.aliyun.com/repository/public</url>
    </mirror>
  </mirrors>
  
  <!-- 配置文件 -->
  <profiles>
    <profile>
      <id>jdk-11</id>
      <activation>
        <activeByDefault>true</activeByDefault>
        <jdk>11</jdk>
      </activation>
      <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <maven.compiler.compilerVersion>11</maven.compiler.compilerVersion>
      </properties>
    </profile>
  </profiles>
</settings>

🚀 常用镜像配置:

<!-- 华为云镜像 -->
<mirror>
  <id>huaweicloud</id>
  <mirrorOf>*</mirrorOf>
  <url>https://repo.huaweicloud.com/repository/maven/</url>
</mirror>

<!-- 腾讯云镜像 -->
<mirror>
  <id>nexus-tencentyun</id>
  <mirrorOf>*</mirrorOf>
  <url>http://mirrors.cloud.tencent.com/nexus/repository/maven-public/</url>
</mirror>

📁 3. Maven 项目结构深度解析

3.1 标准目录布局详解
my-project/                    # 项目根目录
├── src/                       # 源代码目录
│   ├── main/                  # 主要源代码
│   │   ├── java/              # Java源代码
│   │   │   └── com/example/   # 包结构
│   │   │       └── App.java   # 主类
│   │   ├── resources/         # 资源文件
│   │   │   ├── application.properties  # 配置文件
│   │   │   ├── logback.xml    # 日志配置
│   │   │   └── static/        # 静态资源
│   │   └── webapp/            # Web应用资源(仅Web项目)
│   │       ├── WEB-INF/       # Web配置
│   │       │   └── web.xml    # Web部署描述符
│   │       ├── css/           # 样式文件
│   │       ├── js/            # JavaScript文件
│   │       └── index.html     # 首页
│   └── test/                  # 测试代码
│       ├── java/              # 测试Java代码
│       │   └── com/example/   # 测试包结构
│       │       └── AppTest.java # 测试类
│       └── resources/         # 测试资源文件
│           └── test.properties # 测试配置
├── target/                    # 编译输出目录(自动生成)
│   ├── classes/               # 编译后的class文件
│   ├── test-classes/          # 测试class文件
│   ├── surefire-reports/      # 测试报告
│   └── my-project-1.0.jar     # 打包后的jar文件
├── pom.xml                    # Maven项目对象模型文件
└── README.md                  # 项目说明文档
3.2 为什么采用这种目录结构?

🎯 设计原则:

  1. 关注点分离:源码、测试、资源分别存放
  2. 约定优于配置:标准化减少配置工作
  3. 构建工具友好:IDE和构建工具都能识别
  4. 团队协作:统一结构便于团队开发

💡 各目录作用详解:

目录作用说明
src/main/java主要Java源代码业务逻辑代码
src/main/resources主要资源文件配置文件、静态资源等
src/main/webappWeb应用资源仅Web项目需要
src/test/java测试Java代码单元测试、集成测试
src/test/resources测试资源文件测试配置文件
target构建输出目录编译、打包结果
3.3 手动创建 Maven 项目

方法1:使用Maven原型(推荐)

# 创建简单Java项目
mvn archetype:generate \
  -DgroupId=com.example \
  -DartifactId=my-app \
  -DarchetypeArtifactId=maven-archetype-quickstart \
  -DinteractiveMode=false

# 创建Web项目
mvn archetype:generate \
  -DgroupId=com.example \
  -DartifactId=my-web-app \
  -DarchetypeArtifactId=maven-archetype-webapp \
  -DinteractiveMode=false

方法2:手动创建目录结构

# 创建项目根目录
mkdir my-project && cd my-project

# 创建标准目录结构
mkdir -p src/main/java/com/example
mkdir -p src/main/resources
mkdir -p src/test/java/com/example
mkdir -p src/test/resources

# 创建基本的pom.xml文件
touch pom.xml

📝 基础pom.xml模板:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    <groupId>com.example</groupId>
    <artifactId>my-project</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>
    
    <name>My Project</name>
    <description>A sample Maven project</description>
    
    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    
    <dependencies>
        <!-- JUnit 5 测试框架 -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>5.9.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.11.0</version>
                <configuration>
                    <source>11</source>
                    <target>11</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

📌 第二阶段:POM 文件深度解析

📋 4. pom.xml 完全详解

POM(Project Object Model)是Maven的核心,包含了项目的所有信息和配置。

4.1 GAV 坐标详解

🎯 GAV坐标是Maven项目的唯一标识符:

<!-- G: Group ID - 组织或公司的标识 -->
<groupId>com.example</groupId>

<!-- A: Artifact ID - 项目的标识 -->
<artifactId>my-project</artifactId>

<!-- V: Version - 版本号 -->
<version>1.0.0-SNAPSHOT</version>

📝 命名规范:

元素命名规范示例
groupId反向域名com.alibaba, org.apache.commons
artifactId项目名称(小写,用连字符分隔)spring-boot, mysql-connector-java
version语义化版本1.0.0, 2.1.3-SNAPSHOT

🔢 版本号规范:

  • SNAPSHOT:开发版本,会自动更新
  • RELEASE:正式发布版本
  • 语义化版本:主版本.次版本.修订版本
    • 主版本:不兼容的API修改
    • 次版本:向下兼容的功能性新增
    • 修订版本:向下兼容的问题修正
4.2 packaging 打包类型
<!-- 打包类型决定了项目的构建方式和输出格式 -->
<packaging>jar</packaging>

📦 常用打包类型:

类型说明输出文件适用场景
jarJava归档文件(默认).jar普通Java项目、库项目
warWeb应用归档文件.warWeb应用项目
pom仅包含POM文件无父项目、聚合项目
ear企业应用归档文件.earJava EE应用
maven-pluginMaven插件.jarMaven插件开发
4.3 properties 属性配置
<properties>
    <!-- 编译器版本 -->
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>

    <!-- 编码设置 -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

    <!-- 依赖版本管理 -->
    <spring.version>5.3.21</spring.version>
    <junit.version>5.9.2</junit.version>
    <mysql.version>8.0.33</mysql.version>

    <!-- 插件版本 -->
    <maven-compiler-plugin.version>3.11.0</maven-compiler-plugin.version>
    <maven-surefire-plugin.version>3.0.0</maven-surefire-plugin.version>

    <!-- 自定义属性 -->
    <project.mainClass>com.example.Application</project.mainClass>
    <docker.image.prefix>example</docker.image.prefix>
</properties>

💡 属性使用方式:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${spring.version}</version>
</dependency>
4.4 dependencies 依赖管理详解
<dependencies>
    <!-- 基础依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
        <!-- 依赖范围 -->
        <scope>compile</scope>
        <!-- 可选依赖 -->
        <optional>false</optional>
        <!-- 排除传递依赖 -->
        <exclusions>
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <!-- 测试依赖 -->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>${junit.version}</version>
        <scope>test</scope>
    </dependency>

    <!-- 运行时依赖 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql.version}</version>
        <scope>runtime</scope>
    </dependency>

    <!-- 提供的依赖 -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
    </dependency>
</dependencies>
4.5 scope 依赖范围详解
范围编译时测试时运行时传递性说明
compile✅✅✅✅默认范围,所有阶段都需要
provided✅✅❌❌编译和测试时需要,运行时由容器提供
runtime❌✅✅✅运行和测试时需要,编译时不需要
test❌✅❌❌仅测试时需要
system✅✅❌❌类似provided,但需要显式指定jar路径
import----仅用于dependencyManagement中导入BOM

🔍 实际应用示例:

<!-- compile: 业务逻辑依赖 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
    <!-- scope默认为compile,可以省略 -->
</dependency>

<!-- provided: Servlet API(Tomcat提供) -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>

<!-- runtime: 数据库驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version>
    <scope>runtime</scope>
</dependency>

<!-- test: 测试框架 -->
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>4.11.0</version>
    <scope>test</scope>
</dependency>
4.6 optional 可选依赖
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.3.21</version>
    <optional>true</optional>
</dependency>

💡 可选依赖的作用:

  • 当前项目可以使用该依赖
  • 但依赖当前项目的其他项目不会自动获得该依赖
  • 需要显式声明才能使用
4.7 build 构建配置
<build>
    <!-- 最终构建的文件名 -->
    <finalName>my-application</finalName>

    <!-- 源码目录(默认src/main/java) -->
    <sourceDirectory>src/main/java</sourceDirectory>

    <!-- 测试源码目录(默认src/test/java) -->
    <testSourceDirectory>src/test/java</testSourceDirectory>

    <!-- 资源文件配置 -->
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
        </resource>
    </resources>

    <!-- 插件配置 -->
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.11.0</version>
            <configuration>
                <source>11</source>
                <target>11</target>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
    </plugins>
</build>
4.8 parent 父POM继承
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.0</version>
    <relativePath/>
</parent>

💡 继承的内容:

  • 依赖版本管理
  • 插件配置
  • 属性配置
  • 仓库配置
4.9 modules 多模块项目
<modules>
    <module>my-project-core</module>
    <module>my-project-web</module>
    <module>my-project-service</module>
</modules>

🔍 5. 依赖管理深度实践

5.1 如何查找依赖?

🌐 主要依赖搜索网站:

  1. Maven Central Repository

    • 网址:https://search.maven.org/
    • 特点:官方仓库,最权威
    • 使用:搜索artifact名称或groupId
  2. MVN Repository

    • 网址:https://mvnrepository.com/
    • 特点:界面友好,信息详细
    • 优势:显示依赖统计、版本历史
  3. Spring Initializr

    • 网址:https://start.spring.io/
    • 特点:Spring生态专用
    • 优势:自动生成项目结构

🔍 搜索技巧:

# 1. 按类名搜索
搜索关键词:StringUtils
结果:org.apache.commons:commons-lang3

# 2. 按功能搜索
搜索关键词:JSON parser
结果:com.fasterxml.jackson.core:jackson-core

# 3. 按厂商搜索
搜索关键词:alibaba fastjson
结果:com.alibaba:fastjson
5.2 依赖传递性机制

🔗 传递性依赖示例:

项目A 依赖 项目B (1.0)
项目B 依赖 项目C (2.0)
项目B 依赖 项目D (1.5)

结果:项目A 自动获得 项目C (2.0) 和 项目D (1.5)

📊 依赖传递规则:

  1. 最短路径优先

    A → B → C → X (2.0)
    A → D → X (1.0)
    
    结果:选择 X (1.0) - 路径更短
    
  2. 第一声明优先

    <!-- 在pom.xml中的声明顺序 -->
    <dependency>
        <groupId>org.example</groupId>
        <artifactId>lib-a</artifactId> <!-- 依赖 X (1.0) -->
    </dependency>
    <dependency>
        <groupId>org.example</groupId>
        <artifactId>lib-b</artifactId> <!-- 依赖 X (2.0) -->
    </dependency>
    
    结果:选择 X (1.0) - 先声明
    
  3. 覆盖传递依赖

    <!-- 显式声明覆盖传递依赖 -->
    <dependency>
        <groupId>org.example</groupId>
        <artifactId>X</artifactId>
        <version>3.0</version> <!-- 覆盖传递的1.0或2.0版本 -->
    </dependency>
    
5.3 依赖冲突解决策略

🔧 查看依赖树:

# 查看完整依赖树
mvn dependency:tree

# 查看特定依赖的冲突
mvn dependency:tree -Dverbose -Dincludes=org.springframework:spring-core

# 分析依赖冲突
mvn dependency:analyze

📋 依赖树输出示例:

[INFO] com.example:my-project:jar:1.0.0
[INFO] +- org.springframework:spring-core:jar:5.3.21:compile
[INFO] |  +- org.springframework:spring-jcl:jar:5.3.21:compile
[INFO] |  \- (commons-logging:commons-logging:jar:1.2:compile - omitted for conflict with 1.1.3)
[INFO] +- commons-logging:commons-logging:jar:1.1.3:compile
[INFO] \- junit:junit:jar:4.13.2:test
[INFO]    \- org.hamcrest:hamcrest-core:jar:1.3:test

🛠️ 解决冲突的方法:

方法1:使用exclusions排除冲突依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.3.21</version>
    <exclusions>
        <!-- 排除冲突的commons-logging -->
        <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

方法2:显式声明依赖版本

<!-- 显式声明要使用的版本 -->
<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
</dependency>

方法3:使用dependencyManagement统一管理

<dependencyManagement>
    <dependencies>
        <!-- 统一版本管理 -->
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
    </dependencies>
</dependencyManagement>

📌 第三阶段:Maven 生命周期与插件

🔄 6. Maven 生命周期详解

Maven有三个内置的构建生命周期:Clean、Default和Site。

6.1 Clean 生命周期

🧹 清理项目构建产生的文件

阶段说明
pre-clean执行清理前需要完成的工作
clean清理上一次构建生成的文件
post-clean执行清理后需要完成的工作
# 清理项目
mvn clean

# 清理并编译
mvn clean compile
6.2 Default 生命周期(核心)

🏗️ 项目部署的处理

阶段说明常用命令
validate验证项目是否正确且所有必须信息是可用的-
compile编译项目的源代码mvn compile
test使用合适的单元测试框架测试已编译的源代码mvn test
package接受已编译的代码并打包成可发布的格式mvn package
verify运行任何检查以验证包是否有效且达到质量标准mvn verify
install安装包到本地仓库,以让其它项目依赖mvn install
deploy将最终的包复制到远程仓库mvn deploy

🔍 详细阶段说明:

# 1. 编译主代码
mvn compile
# 编译 src/main/java 下的Java文件到 target/classes

# 2. 编译测试代码
mvn test-compile
# 编译 src/test/java 下的测试文件到 target/test-classes

# 3. 运行测试
mvn test
# 运行单元测试,生成测试报告

# 4. 打包项目
mvn package
# 根据packaging类型打包(jar/war/ear等)

# 5. 安装到本地仓库
mvn install
# 将项目安装到本地Maven仓库

# 6. 部署到远程仓库
mvn deploy
# 将项目部署到远程Maven仓库
6.3 Site 生命周期

📄 创建项目站点文档

阶段说明
pre-site执行生成站点前需要完成的工作
site生成项目的站点文档
post-site执行生成站点后需要完成的工作
site-deploy将生成的站点文档部署到特定的服务器
# 生成项目站点
mvn site

# 生成并部署站点
mvn site-deploy
6.4 生命周期阶段的执行顺序

⚡ 重要特性:

  • 执行某个阶段时,会自动执行该阶段之前的所有阶段
  • 不同生命周期之间相互独立
# 执行package时的完整流程
mvn package

# 实际执行顺序:
# 1. validate
# 2. initialize
# 3. generate-sources
# 4. process-sources
# 5. generate-resources
# 6. process-resources
# 7. compile
# 8. process-classes
# 9. generate-test-sources
# 10. process-test-sources
# 11. generate-test-resources
# 12. process-test-resources
# 13. test-compile
# 14. process-test-classes
# 15. test
# 16. prepare-package
# 17. package

🔌 7. Maven 插件详解

Maven的核心功能都是通过插件实现的。每个生命周期阶段都绑定了特定的插件目标。

7.1 插件的基本概念

🎯 插件目标(Plugin Goal)

  • 插件是由一个或多个目标组成的
  • 目标是插件中的一个功能单元
  • 格式:插件前缀:目标 或 groupId:artifactId:version:goal
# 执行编译插件的compile目标
mvn compiler:compile

# 执行依赖插件的tree目标
mvn dependency:tree
7.2 常用插件详解

🔧 maven-compiler-plugin(编译插件)

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.11.0</version>
    <configuration>
        <!-- Java版本 -->
        <source>11</source>
        <target>11</target>
        <!-- 编码格式 -->
        <encoding>UTF-8</encoding>
        <!-- 编译参数 -->
        <compilerArgs>
            <arg>-parameters</arg>
            <arg>-Xlint:unchecked</arg>
        </compilerArgs>
        <!-- 是否显示详细信息 -->
        <verbose>true</verbose>
        <!-- 是否显示弃用警告 -->
        <showDeprecation>true</showDeprecation>
        <!-- 是否显示警告 -->
        <showWarnings>true</showWarnings>
    </configuration>
</plugin>

🧪 maven-surefire-plugin(测试插件)

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>3.0.0</version>
    <configuration>
        <!-- 跳过测试 -->
        <skipTests>false</skipTests>
        <!-- 测试失败时是否忽略 -->
        <testFailureIgnore>false</testFailureIgnore>
        <!-- 包含的测试文件 -->
        <includes>
            <include>**/*Test.java</include>
            <include>**/*Tests.java</include>
        </includes>
        <!-- 排除的测试文件 -->
        <excludes>
            <exclude>**/*IntegrationTest.java</exclude>
        </excludes>
        <!-- 并行执行 -->
        <parallel>methods</parallel>
        <threadCount>4</threadCount>
        <!-- 系统属性 -->
        <systemPropertyVariables>
            <spring.profiles.active>test</spring.profiles.active>
        </systemPropertyVariables>
    </configuration>
</plugin>

📦 maven-jar-plugin(JAR打包插件)

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.3.0</version>
    <configuration>
        <!-- 归档配置 -->
        <archive>
            <!-- 清单文件配置 -->
            <manifest>
                <!-- 添加classpath -->
                <addClasspath>true</addClasspath>
                <!-- classpath前缀 -->
                <classpathPrefix>lib/</classpathPrefix>
                <!-- 主类 -->
                <mainClass>com.example.Application</mainClass>
            </manifest>
            <!-- 清单条目 -->
            <manifestEntries>
                <Built-By>Maven</Built-By>
                <Build-Jdk>${java.version}</Build-Jdk>
                <Implementation-Version>${project.version}</Implementation-Version>
            </manifestEntries>
        </archive>
        <!-- 排除文件 -->
        <excludes>
            <exclude>**/*.properties</exclude>
        </excludes>
    </configuration>
</plugin>

🌐 maven-war-plugin(WAR打包插件)

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>3.3.2</version>
    <configuration>
        <!-- WAR文件名 -->
        <warName>my-web-app</warName>
        <!-- 是否失败在缺少web.xml -->
        <failOnMissingWebXml>false</failOnMissingWebXml>
        <!-- Web资源目录 -->
        <webResources>
            <resource>
                <directory>src/main/webapp</directory>
                <filtering>true</filtering>
                <includes>
                    <include>**/*.html</include>
                    <include>**/*.jsp</include>
                </includes>
            </resource>
        </webResources>
        <!-- 归档配置 -->
        <archive>
            <manifest>
                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
            </manifest>
        </archive>
    </configuration>
</plugin>

🎁 maven-assembly-plugin(自定义打包插件)

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>3.4.2</version>
    <configuration>
        <!-- 描述符 -->
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <!-- 主类 -->
        <archive>
            <manifest>
                <mainClass>com.example.Application</mainClass>
            </manifest>
        </archive>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>
7.3 插件执行配置

⚙️ executions 执行配置

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>3.1.0</version>
    <executions>
        <!-- 在compile阶段执行 -->
        <execution>
            <id>compile-phase-execution</id>
            <phase>compile</phase>
            <goals>
                <goal>run</goal>
            </goals>
            <configuration>
                <target>
                    <echo message="编译阶段执行自定义任务"/>
                    <mkdir dir="${project.build.directory}/custom"/>
                </target>
            </configuration>
        </execution>

        <!-- 在package阶段执行 -->
        <execution>
            <id>package-phase-execution</id>
            <phase>package</phase>
            <goals>
                <goal>run</goal>
            </goals>
            <configuration>
                <target>
                    <echo message="打包阶段执行自定义任务"/>
                    <copy todir="${project.build.directory}/custom">
                        <fileset dir="${project.build.directory}/classes"/>
                    </copy>
                </target>
            </configuration>
        </execution>
    </executions>
</plugin>

📚 上篇总结与下篇预告

🎯 上篇学习成果检验

通过上篇的学习,您应该掌握:

✅ 基础概念

  • Maven的核心作用和设计思想
  • 标准项目结构和目录布局
  • 环境安装和配置优化

✅ POM文件配置

  • GAV坐标系统和命名规范
  • 依赖管理和scope范围
  • 属性配置和构建设置
  • 依赖冲突的识别和解决

✅ 生命周期与插件

  • 三大生命周期的阶段和作用
  • 常用插件的配置和使用
  • 插件执行的绑定和配置

🚀 下篇内容预告

在下篇中,我们将深入探讨:

📌 第四阶段:高级应用

  • 🏗️ 多模块项目管理:父子POM配置、模块依赖、构建策略
  • 🎛️ Profile配置管理:多环境配置、条件激活、属性覆盖
  • 📦 仓库管理:本地/远程仓库、镜像配置、部署策略

📌 第五阶段:实战案例与最佳实践

  • 🎯 Spring Boot项目实战:完整项目配置、Docker集成
  • ⚡ 常用命令大全:依赖管理、插件操作、高级选项
  • 🔧 故障排除指南:常见问题诊断、调试技巧、性能优化
  • 🏆 最佳实践:项目结构规范、版本管理、构建优化

📚 继续学习:建议先通过实际项目练习上篇内容,熟悉Maven的基础操作后,再继续学习下篇的高级应用和实战案例。


💡 学习建议:上篇内容是Maven学习的基础,建议通过创建实际项目来练习POM配置、依赖管理和插件使用,为学习下篇的高级内容做好准备。

全网最详细的 Maven 教程,安排 前言:目前所有的项目都在使用maven,可是一直没有时间去整理学习,这两天正好有时间,好好的整理一下。① 一个项目就是一个工程如果项目非常庞大,就不适合使用package来划分模块,最好是每一个模块对应一个工程,利于分工协作。借助于maven就可以将一个项目拆分成多个工程② 项目中使用jar包,需要“复制”、“粘贴”项目的lib中同样的jar包重复的出现在不同的项目工程中,你需要做不停的复制粘贴的重复工作。借助于maven,可以将jar包保存在“仓库”中,不管在哪个项目只要使用引用即可就行。③ jar包需要 阅读详情

相关推荐

HAL库硬件SPI驱动ST7735 TFT屏幕:从零实现高效刷屏与图形绘制

本文详细介绍了如何使用STM32的HAL库硬件SPI驱动ST7735 TFT屏幕,从硬件连接到SPI配置优化,再到图形绘制与文本显示的实现。重点分享了DMA传输、局部刷新等高级优化技巧,显著提升刷屏效率,帮助开发者快速掌握屏幕驱动技术并应用于实际项目。

pink的博客 740

Maven全网最细学习手册(下篇)

探讨Maven高级应用,涵盖多模块项目管理、Profile环境配置、仓库部署策略,通过Spring Boot实战案例、故障排除指南与最佳实践,成为Maven专家

CodingPhilosophy的博客 638

EPLAN 设备接线图模板制作

属性摆放 设备连接图设置(选项 - - 设置) 连接图生成

weixin_36447711的博客 7862

手把手教你搞定Maven环境变量配置(全网最细教程)

配置环境变量看似简单,但魔鬼都在细节里(说多了都是泪啊!按照这个教程走下来,保证你以后再也不会被折磨。如果还遇到问题,建议检查三遍路径有没有拼写错误(别笑,我见过把Program Files写成ProgramFile的!

guoguo88999的博客 6295

基于浏览器插件的拼多多买家订单导出方法

基于浏览器插件的拼多多买家订单导出方法

2501_93542170的博客 1716

解密UFS Explorer:Drobo BeyondRAID数据恢复实战指南

本文详细介绍了使用UFS Explorer Professional Recovery软件中的Drobo BeyondRAID助手进行数据恢复的完整实战流程。当Drobo设备因BeyondRAID配置信息丢失而无法访问时,该工具能安全、只读地扫描硬盘,虚拟重建存储池,帮助用户找回宝贵数据。指南涵盖了从前期准备、硬盘选择、配置扫描到数据安全导出的每一步关键操作与常见问题解决方案。

weixin_29219539的博客 269

全网最详细的 Maven 教程!

前言:目前所有的项目都在使用maven,可是一直没有时间去整理学习,这两天正好有时间,好好的整理一下。一、为什么使用Maven这样的构建工具【why】① 一个项目就是一个工程如果项目非常庞...

weixin_45727359的博客 2041

AHB不对称半桥反激电路设计(三)主要器件参数规格计算

本文介绍了AHB拓扑变压器的设计步骤与核心参数计算,包括主控芯片选择、工作原理分析及参数计算。作者选择DK87XXD集成MOS方案,详细阐述了输入电压范围、反射电压限定、匝比计算、工作频率设定、原副边电流值、电感量计算、磁芯选择、匝数计算、谐振电容设计等关键步骤。通过公式推导与实例计算,展示了150W电源的变压器设计过程,最终确定匝比5.5、原边22匝、副边4匝、电感量200uH等参数。文章还讨论了谐振电容与漏感的关系,为后续调试提供理论基础。该设计方法结合理论分析与工程实践,适用于AHB拓扑电源开发。

【Simon】的博客 3332

全网最详细的Maven基础知识指南

Maven是Java项目标准构建工具,通过pom.xml管理项目依赖和构建流程。核心功能包括:依赖自动下载、标准化生命周期(clean-compile-test-package)、多模块管理。采用"约定优于配置",规定统一目录结构,通过坐标定位依赖。本地仓库缓存依赖,支持中央仓库和私有仓库。支持Profile多环境配置,插件机制扩展功能。与IDE和CI工具深度集成,显著提升Java项目开发效率,是Java生态不可或缺的基础工具。

wll0417yj的博客 2366

从Demo到产品:基于ADAU1452的ANC方案,硬件选型、性能优化与避坑指南

本文详细解析了基于ADAU1452的主动降噪(ANC)方案从Demo到产品的实现路径,涵盖硬件选型、性能优化与实战避坑指南。重点探讨了ADAU1452与ADAU1466的性能差异、编解码器选型策略,以及MFXLMS算法优化技巧,为工程师提供从理论验证到量产落地的系统级解决方案。

weixin_30542079的博客 451

绘制Winform动态折线图,LiveCharts如何打造数据可视化神器?

在C# Winform应用程序中,使用LiveCharts库来创建动态、美观的折线图不仅能够提升用户体验,还能直观展示数据趋势。下面,我们将通过一个详尽的示例,展示如何在Winform项目中集成LiveCharts并绘制折线图。:在Visual Studio中,选择“文件” > “新建” > “项目”,然后选择“Windows Forms 应用(.NET)”模板。LiveCharts的强大之处在于其高度的可定制性,你可以根据需求调整颜色、动画效果、交互方式等,让图表更加符合你的应用需求。

java专栏 1683

Maven安装与配置教程(全网最详细~)

本文详细介绍了Maven的安装配置过程:首先从官网下载并解压到无中文路径;然后配置MAVEN_HOME环境变量和Path路径;接着修改本地仓库路径和设置阿里云镜像源以提高下载速度;最后配置IDEA中的Maven设置。完成这些步骤后,即可在IDEA中便捷地使用Maven进行项目管理。

xinsuiyu123的博客 2894

ros入门(八)---TF坐标转换

TF(TransForm),就是坐标转换,包括了位置和姿态两个方面的变换。

weixin_51157015的博客 3388

若依以及flowbale达梦国产化数据库改造_全网最细

全网最细的基于若依的Springboot,以及flowable6.7.0版本工作流的达梦数据库国产化改造步骤。

谁说自己不可以 4274

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

全网最细!Maven 编译构建 Java Web 项目从入门到实战一文吃透

本文介绍 Maven 构建 JavaWeb 项目的完整流程。概述 Maven 核心功能、三大构建生命周期及常用命令,讲解 openEuler 下 JDK 与 Maven 环境安装配置。以 JPress 为例,演示源码获取、编译打包、部署运行及 MySQL 安装配置。最后介绍 Maven Wrapper(mvnw)使用,结合 Spring PetClinic 项目,展示数据库创建、jar 包部署与系统服务配置等生产实践。

2302_80380397的博客 1072

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Window下安装与配置Maven(全网最细!!!)

Window下安装与配置Maven1.下载 maven 压缩包2. 解压 maven3. 配置阿里云仓库4. 配置Windows环境变量 1.下载 maven 压缩包 官方网址:http://maven.apache.org/download.cgi 然后看到这个界面 选择 apache-maven-3.6.3-bin.zip 2. 解压 maven (文件路径不建议用有中文的,最好自己新建一个那样方便好多) 然后创建本地仓库 MavenRepository 然后打开 conf文件夹中 修改里面的

weixin_36815898的博客 279

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

全网最细Eclipse中搭建Maven开发环境导入Netty依赖包的详细教程

嘿,各位小伙伴们,今天咱们来聊聊如何安装 Maven 并配置环境变量,再顺便优化一下 Maven 的配置文件,让它能够使用阿里云的镜像来加速我们项目的依赖库下载。这对于经常需要构建和依赖管理的小伙伴们来说,绝对是一个大大的福利!

2403_88996764的博客 776

windows安装多个maven_全网最容易理解的Maven安装、配置、集成演示

Hello,大家好!我是你们的enbo老师,今天心血来潮,又要和大家讨论技术问题啦!大家是不是很激动啊?!哈哈哈。。。最近有学生经常问到关于maven配置的问题,他们在maven的使用过程中,经常会出现很多乱七八糟的情况,非常的困惑,在他们眼里,明明配置正确了,为啥总是出问题?一万个为什么即刻划满天空!enbo老师也是过来人,深知你们的感受,哈哈!所以,我今天打算好好给大家讲解一下maven的配置...

weixin_30126739的博客 8295

Maven安装下载及配置全网最详细最简洁教程(2023最新版)

什么是mavenMaven是基于POM的一款进行项目依赖管理工具,构建管理和项目信息管理的工具。一个依赖管理系统。为什么要使用maven1. 使用了maven可以避免用户自己手动下载jar包2. 后期维护项目会节省大量时间3. maven提供了约定的项目的目录结构,自动创建项目目录,提高开发效率。

fkskd的博客 7363

2023全网最细最全保姆级gitlab+Jenkins+maven自动化部署springboot项目教程

2023全网最新最细最全从0到1教你gitlab+Jenkins自动化部署springboot项目,GOGO学起来.

holdon 5983

RocketMQ的下载与安装(全网最细保姆级别教学)

RocketMQ的下载与安装(全网最细保姆级别教学)

舒一笑的博客 2万+

MAVEN全网最详版,没有之一

maven基础版

qq_43439649的博客 398

SSM整合项目(全网最细的环境搭建教程)

本文共有35000多字,完整的记录了后端SSM项目的整合步骤,内容十分详细! 还包括的Git +GitHub的实战操作,MyBatis的逆向工程。

Sun的个人博客 2463

手把手教你给Maven换装阿里云极速引擎(全网最细配置指南)

记得每半年检查一次镜像配置,就像给爱车做保养!遇到诡异问题欢迎评论区留言,看到必回~(别问我为什么这么热心,都是被慢速下载虐过来的 T_T)下次更新预告:《Maven依赖冲突核弹级解决方案——dependencyTree使用秘籍》,关注不迷路!

pythonqiang9的博客 825

手把手教你给Maven配置阿里云镜像(全网最细保姆级教程)

建议同时配置JDK的国内镜像(比如华为/清华的JDK镜像)遇到奇怪报错时,先执行强制更新依赖配置完成后,你会打开新世界的大门——原先要下半小时的依赖现在只要3秒!赶紧试试看,如果还有问题欢迎评论区留言(看到必回)!

papaquebec的博客 4442

全网最详细的 Maven 深度指南(2025 版)

本文系统梳理了 Maven 从基础到高级的全维度知识体系,涵盖核心原理、高级特性、实战技巧、性能优化和企业级应用案例。通过深入理解 Maven 的底层机制和最佳实践,开发者能够显著提升项目构建效率,解决复杂依赖问题,并在大规模项目中实现高效协作。未来,随着云原生和微服务架构的普及,Maven 将继续在构建工具链中发挥核心作用,持续演进以适应不断变化的开发需求。

m0_71744084的博客 3220
上一篇: Lambda表达式深入实战:现代业务场景应用指南
下一篇: Maven全网最细学习手册(下篇)
代码哲学系
博客等级 码龄1年 55粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值