java学习之(Maven pom.xml 详细讲解)

一、什么是 pom.xml?

POM = Project Object Model(项目对象模型)

复制代码
Maven 项目的核心配置文件

描述项目的各种信息:依赖、构建配置、插件等

类似于前端项目的 package.json

二、pom.xml 的基本结构

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">
    
    <!-- 1. 项目基本信息 -->
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.example</groupId>
    <artifactId>demo_06</artifactId>
    <version>1.0-SNAPSHOT</version>
    
    <!-- 2. 父项目 -->
    <parent>...</parent>
    
    <!-- 3. 项目属性 -->
    <properties>...</properties>
    
    <!-- 4. 依赖管理 -->
    <dependencies>...</dependencies>
    
    <!-- 5. 构建配置 -->
    <build>...</build>
    
    <!-- 6. 仓库配置 -->
    <repositories>...</repositories>
    
</project>

三、核心元素详解

3.1 项目坐标(GAV)

Maven 用坐标唯一标识一个项目:

xml 复制代码
<groupId>org.example</groupId>     <!-- 组织/公司域名倒序 -->
<artifactId>demo_06</artifactId>   <!-- 项目名称 -->
<version>1.0-SNAPSHOT</version>    <!-- 版本号 -->

版本号说明:

复制代码
SNAPSHOT:开发版本,不稳定

RELEASE:正式版本

数字版本:如 1.0.0、2.1.3

完整坐标示例:

text 复制代码
org.springframework.boot:spring-boot-starter-web:3.2.3
└─────groupId──────┘└────artifactId────┘└─version─┘

3.2 父项目(parent)

继承另一个项目的配置,避免重复配置:

xml 复制代码
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.2.3</version>
    <relativePath/>  <!-- 从中央仓库查找,而不是本地 -->
</parent>

作用:

复制代码
继承依赖版本管理(不用写版本号)

继承插件配置

继承 Java 版本设置

为什么需要 parent?

xml 复制代码
<!-- 有 parent:不需要指定版本 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <!-- 版本由 parent 管理 -->
</dependency>

<!-- 无 parent:必须指定版本 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>3.2.3</version>  <!-- 必须写 -->
</dependency>

3.3 属性配置(properties)

定义可复用的变量:

xml 复制代码
<properties>
    <!-- Java 编译版本 -->
    <maven.compiler.source>21</maven.compiler.source>
    <maven.compiler.target>21</maven.compiler.target>
    
    <!-- 项目编码 -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    
    <!-- 自定义属性 -->
    <spring.version>3.2.3</spring.version>
    <mybatis.version>3.5.6</mybatis.version>
</properties>

使用属性:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>${spring.version}</version>  <!-- 引用属性 -->
</dependency>

3.4 依赖管理(dependencies)

这是最重要的部分,声明项目需要哪些外部库:

xml 复制代码
<dependencies>
    <!-- 每个 dependency 代表一个依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <!-- 版本由 parent 管理,可选 -->
    </dependency>
    
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.33</version>
        <scope>runtime</scope>  <!-- 作用范围 -->
    </dependency>
    
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.30</version>
        <scope>provided</scope>  <!-- 编译时需要,运行时由容器提供 -->
    </dependency>
    
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <scope>test</scope>  <!-- 只在测试时使用 -->
    </dependency>
</dependencies>

依赖范围(scope)详解:
依赖范围对照表

scope 编译 测试 运行 说明
compile 默认范围,所有阶段都需要
provided 运行时由容器提供(如 servlet-api)
runtime 运行时需要,编译不需要
test 仅测试时需要(如 JUnit)
system 从本地系统路径加载(不推荐)

3.5 构建配置(build)

配置编译、打包等构建过程:

xml 复制代码
<build>
    <!-- 最终打包的文件名 -->
    <finalName>myapp</finalName>
    
    <!-- 插件配置 -->
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <mainClass>org.example.Main</mainClass>  <!-- 指定启动类 -->
            </configuration>
        </plugin>
        
        <!-- 编译插件 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.11.0</version>
            <configuration>
                <source>21</source>
                <target>21</target>
            </configuration>
        </plugin>
    </plugins>
</build>

3.6 仓库配置(repositories)

配置依赖下载源:

xml 复制代码
<repositories>
    <repository>
        <id>aliyun</id>
        <name>Aliyun Maven Repository</name>
        <url>https://maven.aliyun.com/repository/public</url>
        <releases>
            <enabled>true</enabled>
        </releases>
        <snapshots>
            <enabled>false</enabled>  <!-- 不下载快照版本 -->
        </snapshots>
    </repository>
</repositories>

四、Spring Boot Starter 说明

Spring Boot 提供了一系列 "starter" 依赖,自动引入相关依赖:

以下是整理后的表格格式:

Starter 作用
spring-boot-starter-web Web 开发(包含 Spring MVC、Tomcat)
spring-boot-starter-data-jpa 数据库操作(JPA)
spring-boot-starter-test 测试框架
spring-boot-starter-security 安全框架
spring-boot-starter-redis Redis 缓存
spring-boot-starter-thymeleaf 模板引擎

一个 starter 会引入多个依赖:

xml 复制代码
<!-- spring-boot-starter-web 实际引入 -->
- spring-boot-starter
- spring-web
- spring-webmvc
- tomcat-embed-core
- jackson-databind
- ...

五、常用 Maven 命令

bash 复制代码
# 清理编译文件
mvn clean

# 编译项目
mvn compile

# 运行测试
mvn test

# 打包(生成 jar/war)
mvn package

# 安装到本地仓库
mvn install

# 强制更新依赖
mvn clean install -U

# 查看依赖树
mvn dependency:tree

六、最佳实践

6.1 始终使用 parent 管理版本

xml 复制代码
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.2.3</version>
</parent>

6.2 统一管理版本号

xml 复制代码
<properties>
    <java.version>17</java.version>
    <mybatis.version>3.5.6</mybatis.version>
</properties>

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>${mybatis.version}</version>
</dependency>

6.3 合理使用 scope

xml 复制代码
<!-- 数据库驱动:运行时需要 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

<!-- Lombok:编译时需要 -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <scope>provided</scope>
</dependency>

6.4 排除传递依赖

xml 复制代码
xml
<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>

七、完整示例

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>myproject</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>
    <name>My Spring Boot Project</name>
    <description>Demo project for Spring Boot</description>

    <!-- 父项目 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.3</version>
    </parent>

    <!-- 属性配置 -->
    <properties>
        <java.version>17</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

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

        <!-- 数据库 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.33</version>
            <scope>runtime</scope>
        </dependency>

        <!-- Lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- 测试 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

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

总结

pom.xml 的核心作用:

复制代码
定义项目身份:groupId、artifactId、version

管理依赖:告诉 Maven 需要哪些第三方库

配置构建:编译、测试、打包等过程的配置

继承公共配置:通过 parent 避免重复配置
相关推荐
m0_5648768419 分钟前
提示词工程手册学习
人工智能·python·深度学习·学习
Century_Dragon21 分钟前
世纪龙-从爆炸图到原理动画:让环境感知系统在课堂上“活”起来
学习
阿荻在肝了24 分钟前
Agent学习二:智能体(Agent)开发核心原理
学习
AlunYegeer24 分钟前
MyBatis 传参核心:#{ } 与 ${ } 区别详解(避坑+面试重点)
java·mybatis
少许极端36 分钟前
算法奇妙屋(四十)-贪心算法学习之路7
java·学习·算法·贪心算法
危笑ioi37 分钟前
helm部署skywalking链路追踪 java
java·开发语言·skywalking
夕除1 小时前
Mysql--15
java·数据库·mysql
smileNicky1 小时前
Linux 系列从多节点的catalina 日志中统计设备调用频次
java·linux·服务器
忙什么果1 小时前
Mamba学习笔记2:Mamba模型
android·笔记·学习
悠哉悠哉愿意1 小时前
【物联网学习笔记】ADC
笔记·单片机·嵌入式硬件·物联网·学习