Maven 核心指南

时游大约 3 分钟

一、Maven 简介

Maven 是一个项目管理工具,主要用于 Java 项目的构建依赖管理项目信息管理

1.1 核心作用

  1. 依赖管理:自动下载 jar 包及其依赖,解决版本冲突(Jar 包地狱)。
  2. 统一构建:提供标准的编译、测试、打包、发布流程。
  3. 项目结构标准化:约定优于配置(Convention over Configuration),定义了标准的目录结构。

二、安装与配置

2.1 环境配置

  1. 下载 Maven 压缩包并解压。
  2. 配置环境变量 MAVEN_HOME 指向解压目录。
  3. %MAVEN_HOME%\bin 添加到 PATH 中。
  4. 验证:mvn -v

2.2 settings.xml 配置

Maven 的配置文件位于 conf/settings.xml(全局)或 ~/.m2/settings.xml(用户级)。

配置阿里云镜像(加速下载)

<mirrors>
    <mirror>
        <id>aliyunmaven</id>
        <mirrorOf>*</mirrorOf>
        <name>阿里云公共仓库</name>
        <url>https://maven.aliyun.com/repository/public</url>
    </mirror>
</mirrors>

配置本地仓库位置

<!-- 默认在 ~/.m2/repository -->
<localRepository>D:/maven/repository</localRepository>

三、Maven 核心概念

3.1 坐标 (Coordinates)

Maven 使用 GAV 坐标来唯一标识一个项目或依赖:

  • GroupId:组织或公司域名倒序(如 com.alibaba)。
  • ArtifactId:项目或模块名称(如 fastjson)。
  • Version:版本号(如 1.2.76)。

3.2 POM (Project Object Model)

pom.xml 是 Maven 项目的核心配置文件。

<project>
    <!-- 模型版本 -->
    <modelVersion>4.0.0</modelVersion>
    
    <!-- 项目坐标 -->
    <groupId>com.example</groupId>
    <artifactId>my-app</artifactId>
    <version>1.0-SNAPSHOT</version>
    
    <!-- 打包方式:jar(默认), war, pom -->
    <packaging>jar</packaging>
    
    <!-- 属性配置 -->
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    
    <!-- 依赖列表 -->
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

3.3 标准目录结构

my-app
├── pom.xml                 # 核心配置
└── src
    ├── main
    │   ├── java            # 源代码
    │   └── resources       # 资源文件 (配置文件, xml等)
    └── test
        ├── java            # 测试代码
        └── resources       # 测试资源

四、依赖管理

4.1 依赖范围 (Scope)

通过 <scope> 标签指定依赖的作用范围:

Scope编译 (Compile)测试 (Test)运行 (Run)例子
compile (默认)Spring-Core, Commons-Lang
test--JUnit
provided-Servlet-API (由容器提供)
runtime-JDBC Driver
system-本地 jar 包 (不推荐)

4.2 依赖传递与冲突解决

  • 传递性:A 依赖 B,B 依赖 C,则 A 自动拥有 C。
  • 冲突原则
    1. 路径最近者优先:A -> B -> C(v1) vs A -> D -> C(v2),选 C(v1)。
    2. 第一声明者优先:路径长度相同时,pom 中先声明的优先。

排除依赖 (Exclusion): 如果不想引入传递下来的某个包,可以使用 <exclusions>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

五、构建生命周期 (Lifecycle)

Maven 的生命周期是抽象的,实际工作由插件 (Plugins) 完成。主要的生命周期阶段(按顺序执行):

  1. clean:清理项目(删除 target 目录)。
  2. validate:验证项目是否正确。
  3. compile:编译源代码。
  4. test:运行测试代码。
  5. package:打包(生成 jar 或 war)。
  6. verify:检查包的有效性。
  7. install:安装包到本地仓库(供本地其他项目使用)。
  8. deploy:部署包到远程仓库(私服)。

常用命令

  • mvn clean install:先清理,再构建并安装到本地仓库。
  • mvn package -Dmaven.test.skip=true:打包并跳过测试。
  • mvn dependency:tree:查看依赖树(排查冲突神器)。

六、多模块管理 (Multi-module)

在大型项目中,通常采用父子工程结构。

6.1 父工程 (Parent)

打包方式必须为 pom。主要用于版本管理 (dependencyManagement)。

<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<packaging>pom</packaging>

<modules>
    <module>module-a</module>
    <module>module-b</module>
</modules>

<dependencyManagement>
    <!-- 只声明版本,不引入依赖。子模块引入时无需指定版本 -->
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>
    </dependencies>
</dependencyManagement>

6.2 子模块 (Module)

声明父工程,继承配置。

<parent>
    <groupId>com.example</groupId>
    <artifactId>parent-project</artifactId>
    <version>1.0-SNAPSHOT</version>
</parent>

<artifactId>module-a</artifactId>

<dependencies>
    <!-- 继承父工程版本,无需写 version -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
</dependencies>

七、常用插件配置

7.1 指定 JDK 版本 (Maven Compiler Plugin)

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
    </plugins>
</build>

7.2 打包可执行 Jar (Spring Boot Maven Plugin)

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
上次编辑于:
贡献者: 15327360835
Loading...