JDWA 技术文档
首页
  • 数据库
  • 前端开发
  • 后端开发
  • 开发工具
  • 虚拟化技术
  • KVM显卡直通
  • FPGA仿真固件
  • 项目实战
  • 踩坑记录
  • 开发心得
  • 软件工具
  • 学习资料
  • 开发环境
更新日志
关于我
Gitee
GitHub
首页
  • 数据库
  • 前端开发
  • 后端开发
  • 开发工具
  • 虚拟化技术
  • KVM显卡直通
  • FPGA仿真固件
  • 项目实战
  • 踩坑记录
  • 开发心得
  • 软件工具
  • 学习资料
  • 开发环境
更新日志
关于我
Gitee
GitHub
  • 数据库

    • 数据库教程
    • MySQL免安装版使用指南
    • MySQL性能优化实践
    • Redis入门与实践
    • MinIO快速部署指南
    • MinIO基础使用教程
  • 前端开发

    • 前端开发教程
    • Vue.js开发最佳实践
    • CSS常用技巧与解决方案
    • JavaScript实用技巧与编程模式
    • CSS Grid布局教程
  • 后端开发

    • 后端开发教程
    • Spring Boot实战指南
    • Node.js Express 框架开发实战指南
    • Python Flask 框架开发指南
  • 开发工具

    • 开发工具教程
    • Git 基础教程
    • Git工作流实践指南
    • VS Code 全面使用指南
    • VS Code必装插件推荐
    • Docker基础入门
    • IntelliJ IDEA 使用技巧
    • Eclipse配置与优化
    • Sublime Text 高级技巧
    • Vim 从入门到精通
    • Maven 详解
    • Gradle 入门与进阶
    • Webpack 配置指南
    • npm 与 yarn 使用技巧
    • Makefile 编写指南
    • Navicat 使用指南
    • MCP本地部署教程
  • 虚拟化技术

    • JDWA虚拟化技术专题
    • KVM虚拟机去虚拟化技术详解
  • KVM显卡直通

    • KVM显卡GPU直通教程
  • FPGA仿真固件

    • FPGA仿真固件开发指南
    • 基础-完整设备仿真定制固件开发指南
    • 中级-完整设备仿真定制固件开发指南
    • 高级-完整设备仿真定制固件开发指南

Maven 详解

Tips

本教程全面介绍Maven构建工具的使用方法,从基础配置到高级应用,适用于Maven 3.6及更高版本。

1. Maven简介

Maven是一个基于项目对象模型(POM)的项目管理和构建自动化工具,主要用于Java项目。它可以管理项目的构建、报告和文档,极大地简化了Java项目的构建过程。

1.1 Maven的核心价值

  • 依赖管理:自动下载和管理项目依赖的jar包
  • 构建标准化:提供标准的、跨平台的自动化项目构建方式
  • 项目信息管理:提供完整的项目信息,包括文档生成、报告、依赖列表等
  • 最佳实践:鼓励使用一组标准的目录结构和构建生命周期

1.2 与其他构建工具的比较

特性MavenAntGradle
构建模型声明式过程式声明式+过程式
配置文件XML (pom.xml)XML (build.xml)Groovy/Kotlin DSL
依赖管理内置需扩展内置
学习曲线中等低高
灵活性中等高非常高
社区支持强大成熟快速增长

2. 安装与配置

2.1 安装Maven

Windows安装:

  1. 下载Maven压缩包:Maven官方下载
  2. 解压到指定目录,如C:\Program Files\Apache\maven
  3. 设置环境变量:
    • 新建MAVEN_HOME,值为Maven安装目录
    • 将%MAVEN_HOME%\bin添加到PATH变量

macOS安装:

# 使用Homebrew
brew install maven

# 验证安装
mvn -version

Linux安装:

# Ubuntu/Debian
sudo apt install maven

# CentOS/RHEL
sudo yum install maven

# 验证安装
mvn -version

2.2 基本配置

Maven的全局配置文件位于${MAVEN_HOME}/conf/settings.xml,用户级配置位于~/.m2/settings.xml。

关键配置项:

  1. 本地仓库位置:
<localRepository>/path/to/local/repo</localRepository>
  1. 远程仓库镜像(加速下载):
<mirrors>
  <mirror>
    <id>aliyun</id>
    <name>Aliyun Maven Repository</name>
    <url>https://maven.aliyun.com/repository/public</url>
    <mirrorOf>central</mirrorOf>
  </mirror>
</mirrors>
  1. 配置JDK版本:
<profiles>
  <profile>
    <id>jdk-17</id>
    <activation>
      <activeByDefault>true</activeByDefault>
      <jdk>17</jdk>
    </activation>
    <properties>
      <maven.compiler.source>17</maven.compiler.source>
      <maven.compiler.target>17</maven.compiler.target>
      <maven.compiler.compilerVersion>17</maven.compiler.compilerVersion>
    </properties>
  </profile>
</profiles>

3. Maven基本概念

3.1 项目对象模型(POM)

POM(Project Object Model)是Maven的基本工作单元,是一个XML文件(pom.xml),包含了项目的基本信息、构建依赖、插件等配置信息。

3.2 坐标系统

Maven使用坐标系统唯一标识一个项目:

  • groupId:组织或团体的唯一标识,通常是反向域名
  • artifactId:项目的唯一标识
  • version:项目版本
  • packaging:打包类型(jar, war, ear等)

例如:

<groupId>com.jdwa</groupId>
<artifactId>jdwa-project</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>

3.3 仓库

Maven仓库用于存储项目的依赖、插件和项目构建输出:

  • 本地仓库:位于开发者计算机上,默认~/.m2/repository
  • 中央仓库:Maven社区维护的公共仓库
  • 远程仓库:组织或团队的私有仓库

4. POM文件详解

4.1 基本结构

完整的POM文件包含以下主要部分:

<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.jdwa</groupId>
    <artifactId>jdwa-project</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>
    
    <name>JDWA Project</name>
    <description>JDWA Sample Maven Project</description>
    <url>https://github.com/AAASS554/jdwa-project</url>
    
    <!-- 属性 -->
    <properties>
        <java.version>17</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    
    <!-- 依赖 -->
    <dependencies>
        <!-- 依赖项 -->
    </dependencies>
    
    <!-- 构建配置 -->
    <build>
        <plugins>
            <!-- 插件 -->
        </plugins>
    </build>
</project>

4.2 继承与聚合

继承:子模块可以继承父模块的配置

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.0</version>
</parent>

聚合:父模块可以聚合多个子模块

<modules>
    <module>module1</module>
    <module>module2</module>
</modules>

5. 依赖管理

5.1 添加依赖

在<dependencies>标签中添加依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.7.0</version>
    </dependency>
    
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.24</version>
        <scope>provided</scope>
    </dependency>
    
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <scope>test</scope>
    </dependency>
</dependencies>

5.2 依赖范围

Maven提供6种依赖范围:

  • compile:默认范围,编译、测试、运行时都有效
  • provided:编译和测试有效,运行时由JDK或容器提供
  • runtime:测试和运行时有效,编译时不需要
  • test:仅测试时有效
  • system:类似provided,但需要显式指定jar文件路径
  • import:只用于<dependencyManagement>,导入依赖配置

5.3 依赖传递与排除

Maven会自动解析并下载传递性依赖:

<!-- 排除传递依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>

5.4 依赖管理

使用<dependencyManagement>集中管理依赖版本:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.7.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

6. 生命周期与插件

6.1 构建生命周期

Maven有三个标准生命周期:

  1. clean:清理项目

    • pre-clean
    • clean
    • post-clean
  2. default:构建项目

    • validate → compile → test → package → verify → install → deploy
  3. site:生成项目文档

    • pre-site
    • site
    • post-site
    • site-deploy

6.2 常用插件

Maven插件用于扩展Maven的功能:

  1. maven-compiler-plugin:编译Java源代码
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.10.1</version>
    <configuration>
        <source>17</source>
        <target>17</target>
    </configuration>
</plugin>
  1. maven-surefire-plugin:执行单元测试
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>3.0.0-M7</version>
    <configuration>
        <skipTests>false</skipTests>
    </configuration>
</plugin>
  1. spring-boot-maven-plugin:创建可执行的Spring Boot应用
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>2.7.0</version>
</plugin>

6.3 自定义插件配置

使用<configuration>元素配置插件参数:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.2.2</version>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <mainClass>com.jdwa.project.Main</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

7. Maven常用命令

7.1 基本命令

  • mvn clean:清理项目,删除target目录
  • mvn compile:编译项目源代码
  • mvn test:运行测试
  • mvn package:打包项目
  • mvn install:安装到本地仓库
  • mvn deploy:部署到远程仓库

7.2 组合命令

Maven命令可以组合使用:

# 清理并打包
mvn clean package

# 跳过测试打包
mvn package -DskipTests

# 构建并安装到本地仓库
mvn clean install

7.3 项目创建命令

使用Maven原型创建项目:

# 创建普通Java项目
mvn archetype:generate -DgroupId=com.jdwa -DartifactId=jdwa-project -DarchetypeArtifactId=maven-archetype-quickstart

# 创建Web项目
mvn archetype:generate -DgroupId=com.jdwa -DartifactId=jdwa-webapp -DarchetypeArtifactId=maven-archetype-webapp

8. 多模块项目

8.1 模块结构

parent-project/
├── pom.xml (parent)
├── module1/
│   └── pom.xml (child)
├── module2/
│   └── pom.xml (child)
└── module3/
    └── pom.xml (child)

8.2 父POM配置

<project>
    <modelVersion>4.0.0</modelVersion>
    
    <groupId>com.jdwa</groupId>
    <artifactId>parent-project</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>
    
    <modules>
        <module>module1</module>
        <module>module2</module>
        <module>module3</module>
    </modules>
    
    <dependencyManagement>
        <!-- 集中管理依赖版本 -->
    </dependencyManagement>
    
    <build>
        <pluginManagement>
            <!-- 集中管理插件版本 -->
        </pluginManagement>
    </build>
</project>

8.3 子模块配置

<project>
    <modelVersion>4.0.0</modelVersion>
    
    <parent>
        <groupId>com.jdwa</groupId>
        <artifactId>parent-project</artifactId>
        <version>1.0.0</version>
    </parent>
    
    <artifactId>module1</artifactId>
    
    <dependencies>
        <!-- 模块特定依赖 -->
    </dependencies>
</project>

9. 最佳实践

9.1 项目结构规范

遵循Maven标准目录结构:

project-root/
├── src/
│   ├── main/
│   │   ├── java/       # Java源代码
│   │   ├── resources/  # 资源文件
│   │   └── webapp/     # Web应用资源
│   └── test/
│       ├── java/       # 测试源代码
│       └── resources/  # 测试资源
├── target/             # 构建输出
└── pom.xml             # 项目配置

9.2 依赖管理策略

  • 使用<dependencyManagement>集中管理依赖版本
  • 使用属性定义版本号,方便统一升级
  • 定期检查并更新过时的依赖
  • 避免使用过多的传递依赖

9.3 版本控制策略

使用语义化版本号:Major.Minor.Patch

  • 开发版本:1.0.0-SNAPSHOT
  • 发布版本:1.0.0
  • 里程碑版本:1.0.0-M1
  • 发布候选版本:1.0.0-RC1

9.4 常见问题解决

  1. 依赖冲突:

    • 使用mvn dependency:tree查看依赖树
    • 使用<exclusions>排除冲突依赖
    • 在<dependencyManagement>中明确指定版本
  2. 编译问题:

    • 确保正确配置JDK版本
    • 检查源代码和目标JDK版本匹配
  3. 下载慢问题:

    • 配置国内镜像仓库
    • 创建企业内部镜像仓库

10. 高级特性

10.1 Maven Profile

使用profile适配不同环境:

<profiles>
    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <env>dev</env>
            <db.url>jdbc:mysql://localhost:3306/devdb</db.url>
        </properties>
    </profile>
    <profile>
        <id>prod</id>
        <properties>
            <env>prod</env>
            <db.url>jdbc:mysql://prod-server:3306/proddb</db.url>
        </properties>
    </profile>
</profiles>

使用方式:mvn package -Pprod

10.2 资源过滤

过滤资源文件中的属性:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

在资源文件中使用:

database.url=${db.url}
application.name=${project.name}
build.version=${project.version}

10.3 Maven扩展

  1. Maven Release Plugin:自动化版本发布
  2. JaCoCo:代码覆盖率报告
  3. Sonatype Nexus:私有Maven仓库
  4. Jenkins + Maven:持续集成和部署

结语

Maven是Java生态系统中的核心构建工具,掌握Maven不仅能够提高开发效率,还能规范项目结构和构建流程。通过本教程介绍的各种功能和最佳实践,你可以充分利用Maven的强大功能,构建高质量的Java应用。

Prev
Vim 从入门到精通
Next
Gradle 入门与进阶