教程中心 / Java教程 / Maven基础

Maven基础

18分钟 高级特性

引言:什么是Maven?

Maven是Java项目管理和构建工具,用于依赖管理项目构建文档生成

Maven类比:自动售货机

传统方式(手动下载jar):
- 需要什么jar,就去网上搜索下载
- 还需要下载它依赖的其他jar
- 版本冲突?自己解决!

Maven方式:
- 告诉Maven你需要什么
- Maven自动从仓库下载
- 自动解决依赖关系
- 就像扫码取货一样简单!

Maven坐标

Maven坐标是Maven定位仓库中jar包的唯一标识,由三个元素组成。

坐标三要素

元素说明示例
groupId组织/公司名称com.alibaba
artifactId项目/模块名称druid
version版本号1.2.16

依赖配置示例

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.16</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.7.14</version>
</dependency>

仓库类型

Maven使用仓库来存储依赖jar包。

三种仓库

仓库类型说明位置
本地仓库本机存储依赖~/.m2/repository
远程仓库(私服)公司内部仓库nexus.公司.com
中央仓库Maven官方仓库repo.maven.apache.org

仓库优先级

查找顺序:
1. 本地仓库 - 有则直接使用
2. 私服仓库 - 有则下载到本地使用
3. 中央仓库 - 有则下载到本地使用

配置私服(settings.xml):
<mirrors>
    <mirror>
        <id>nexus-aliyun</id>
        <mirrorOf>*</mirrorOf>
        <url>https://maven.aliyun.com/repository/public</url>
    </mirror>
</mirrors>

依赖作用域

作用域控制依赖在哪些阶段生效。

作用域编译测试运行说明
compile默认,全部有效
test仅测试时有效(如JUnit)
provided容器已提供(如Servlet API)
runtime运行时需要(如JDBC驱动)
system系统路径,不推荐

作用域示例

<!-- Spring Boot Web依赖(编译、测试、运行都需要) -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <scope>compile</scope>
</dependency>

<!-- JUnit(仅测试需要) -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

<!-- Servlet API(编译、测试需要,运行时由容器提供) -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <scope>provided</scope>
</dependency>

<!-- JDBC驱动(编译不需要,运行时需要) -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

依赖传递

Maven会自动传递依赖,不需要手动声明间接依赖。

依赖传递示意

项目A
├── spring-boot-starter-web
│   ├── spring-boot-starter
│   │   ├── spring-boot
│   │   └── spring-boot-autoconfigure
│   └── tomcat-embed-core

项目A只需要声明spring-boot-starter-web
其他依赖会自动传递进来!

依赖冲突与排除

<!-- 依赖冲突:两个依赖都引入了不同版本的log4j -->
<!-- 解决:排除不需要的传递依赖 -->

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.76</version>
    <exclusions>
        <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </exclusion>
    </exclusions>
</dependency>

查看依赖树

# 查看项目依赖树
mvn dependency:tree

# 过滤查看特定依赖
mvn dependency:tree -Dincludes=com.alibaba:fastjson

# 分析依赖
mvn dependency:analyze

Maven生命周期

Maven有三个主要生命周期,每个生命周期包含多个阶段

三大生命周期

生命周期说明常用阶段
clean清理构建产物clean
default核心构建过程compile, test, package, install, deploy
site生成项目站点site

常用命令

# 清理并编译
mvn clean compile

# 清理并打包(跳过测试)
mvn clean package -DskipTests

# 清理并安装到本地仓库
mvn clean install

# 运行测试
mvn test

# 生成项目站点
mvn site

# 跳过测试和检查
mvn clean package -DskipTests -Dmaven.test.skip=true

常用阶段说明

阶段说明
validate验证项目结构
compile编译源代码
test-compile编译测试代码
test运行测试
package打包(jar/war)
install安装到本地仓库
deploy部署到远程仓库

pom.xml基本结构

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0">
    <modelVersion>4.0.0</modelVersion>

    <!-- 项目坐标 -->
    <groupId>com.example</groupId>
    <artifactId>my-project</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>

    <!-- 项目属性 -->
    <properties>
        <java.version>17</java.version>
        <maven.compiler.source>17</maven.compiler.source>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <!-- 依赖管理 -->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.7.14</version>
        </dependency>
    </dependencies>

    <!-- 构建配置 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

Maven聚合与继承

聚合(多模块项目)

<!-- 父pom.xml -->
<project>
    <groupId>com.example</groupId>
    <artifactId>parent-project</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>

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

继承(统一版本管理)

<!-- 子模块pom.xml -->
<project>
    <parent>
        <groupId>com.example</groupId>
        <artifactId>parent-project</artifactId>
        <version>1.0.0</version>
    </parent>

    <artifactId>module-a</artifactId>
    <!-- 版本号继承父pom -->
</project>

依赖版本管理(DependencyManagement)

<!-- 父pom.xml -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.76</version>
        </dependency>
    </dependencies>
</dependencyManagement>

<!-- 子模块中引入,不需要指定版本 -->
<dependencies>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <!-- 不写version,继承父pom -->
    </dependency>
</dependencies>

常用Maven命令

mvn clean compile:清理并编译
mvn test:运行测试
mvn package:打包项目
mvn install:安装到本地仓库
mvn dependency:tree:查看依赖树

最佳实践

使用国内镜像:配置阿里云镜像加速下载
避免使用system作用域:不便于移植
统一版本管理:使用parent pom管理版本
排除不需要的传递依赖:避免冲突

小结

  • Maven坐标:groupId + artifactId + version 唯一标识
  • 仓库:本地仓库 → 私服 → 中央仓库
  • 作用域:compile(默认)、test、provided、runtime
  • 依赖传递:自动引入间接依赖,可用exclusions排除
  • 生命周期:clean、default、site
  • 常用命令:compile、test、package、install
  • 聚合与继承:便于多模块项目管理
☕ Java 在线代码编辑器
📝 运行结果