Maven基础

Maven


Maven 是什么

Maven 是 Apache 旗下的开源项目,一款用于管理和构建 Java 项目的工具 。官网:maven.apache.org/

核心作用就三个:

  1. 依赖管理:自动下载和管理 jar 包,解决版本冲突。不用再手动拷贝 jar 到 lib 目录了。
  2. 项目构建:提供标准化的跨平台自动化构建方式------编译、测试、打包、发布一条龙。
  3. 统一项目结构:约定优于配置,所有 Maven 项目结构一致,降低团队协作成本。

核心概念

Maven 的整体架构可以用五个核心概念来概括:

1. 项目对象模型(POM)

POM 是 Maven 的心脏,对应项目根目录下的 pom.xml 文件。它描述了项目的基本信息、依赖关系、构建配置等所有内容。Maven 一切都是围绕着 pom.xml 来运转的。

2. 依赖管理模型(Dependency)

pom.xml 中声明项目需要哪些第三方库,Maven 自动从仓库下载。依赖之间还存在传递性 ------你引了 A,A 又依赖 B、C,Maven 会自动把 B 和 C 也拉下来。如果不需要某个传递依赖,可以通过排除依赖把它去掉。

3. 构建生命周期(Build Lifecycle)

Maven 定义了三套独立的生命周期:

生命周期 作用 常用阶段
clean 清理 删除上次构建产物
default 核心构建 compile → test → package → install → deploy
site 站点生成 生成项目报告文档

阶段是有顺序的 ,执行后面的阶段会自动触发前面的阶段。比如执行 package,它会先执行 compile、再执行 test,最后才打包。

常用命令:

  • mvn clean:清理
  • mvn compile:编译源代码
  • mvn test:运行单元测试
  • mvn package:打包成 jar/war
  • mvn install:安装到本地仓库

4. 插件(Plugin)

生命周期本身只是定义了"做什么",但"具体怎么做"是由插件来实现的。每个阶段背后都有对应的插件在工作。Maven 本质上是一个插件执行框架。

5. 仓库(Repository)

Maven 的仓库是用来存储和管理 jar 包的,分三类,查找顺序如下:

复制代码
本地仓库(你电脑上) → 远程仓库/私服(公司内部) → 中央仓库(Maven 官方)

查找依赖时按这个顺序依次找,找到了就停。如果一路都没找到,就报错了。


Maven 安装

  1. 下载并解压 apache-maven 压缩包

  2. 配置本地仓库:修改 conf/settings.xml 中的 <localRepository> 标签,指定一个目录

    xml 复制代码
    <localRepository>D:\develop\apache-maven-3.9.4\mvn_repo</localRepository>
  3. 配置镜像(如阿里云):修改 <mirrors> 标签,加速下载

    xml 复制代码
    <mirror>  
       <id>alimaven</id>  
       <name>aliyun maven</name>  
       <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
       <mirrorOf>central</mirrorOf>          
    </mirror>
  4. 配置环境变量:设 MAVEN_HOME 为解压目录,把 bin 目录加到 PATH

  5. 验证:mvn -v


IDEA集成Maven

  • 配置Maven环境(全局)

  • 创建Maven项目

    • 创建模块,选择New Module,填写模块信息,选择构建工具为Maven,点击create,创建完成

    • 编写 HelloWorld,并运行

Maven 坐标

坐标是资源(jar)的唯一标识,由三部分组成:

组成部分 含义 示例
groupId 组织名称,通常域名反写 com.company
artifactId 模块/项目名称 order-service
version 版本号 1.0.0

版本分类:

  • SNAPSHOT:快照版本,功能不稳定、还在开发中
  • RELEASE:发布版本,功能稳定、可以用于生产

代码示例

xml 复制代码
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.27</version>
</dependency>

导入maven项目

  • 方式一:File -> Project Structure -> Modules -> Import Module -> 选择maven项目的pom.xml
  • 方式二:Maven面板 -> +(Add Maven Projects) -> 选择maven项目的pom.xml。

依赖管理

依赖配置

pom.xml<dependencies> 标签里,用 <dependency> 引入坐标即可。配置变更后记得点刷新按钮重新加载。本地仓库没有的依赖需要联网下载。

依赖传递

Maven 的依赖具有传递性。比如你的项目 A 依赖了 B,B 又依赖了 C 和 D,那么 Maven 会自动把 C 和 D 也拉进你的项目中,不需要你手动声明。依赖传递遵循两条规则:

  1. 路径优先:路径短的优先
  2. 先声明优先 :路径长度相同时,pom.xml 里谁先声明用谁

依赖传递的好处是你不用关心间接依赖,但也会带来问题------比如传递进来的依赖和你的项目已有的依赖版本冲突,或者有些传递依赖你根本不需要。

排除依赖

有些传递依赖你不需要(比如版本冲突或者冗余),可以通过 <exclusions> 标签主动断开,被排除的资源不用指定版本。

依赖范围(scope)

通过 <scope> 标签控制依赖在什么环境下生效:

scope值 主程序 测试程序 打包运行 典型用途
compile(默认) log4j
test JUnit
provided servlet-api
runtime JDBC驱动
  • 举两个典型例子说明为什么要控制依赖范围:

    • JUnit 用 test 范围: JUnit 只在写单元测试和跑测试的时候需要,主程序根本用不到它,上线打包时更没必要把它打进去。如果把 JUnit 打进生产包,一来增大包体积,二来还可能和运行环境的框架产生莫名其妙的冲突。所以 scope 设成 test这个依赖就只在测试环境生效,到了主程序编码和打包运行时,Maven 自动把它排除掉。这样不同环境的依赖保持轻量化,测试归测试,生产归生产,互不干扰。

    • servlet-api 用 provided 范围: 写代码和跑测试时需要它(import 它的类),但部署到 Tomcat 的时候,Tomcat 容器自己就带了这个 jar,你如果再打一份进去反而会冲突,所以 scope 设成 provided------编译和测试阶段能用,打包时不带走。


Maven 生命周期

  • Maven的生命周期就是为了对所有的maven项目构建过程进行抽象和统一。
  • Maven 有三套独立的生命周期:

    • clean:清理工作。
    • default:核心工作,如:编译、测试、打包、安装、部署等。
    • site:生成报告、发布站点等。
  • 每套生命周期包含一些阶段(phase),阶段是有顺序的,后面的阶段依赖于前面的阶段。

  • 生命周期阶段

    • clean:移除上一次构建生成的文件
    • compile:编译项目源代码
    • test:使用合适的单元测试框架运行测试(junit)
    • package:将编译后的文件打包,如:jar、war等
    • install:安装项目到本地仓库
  • 每个生命周期都配有对应的插件

两种执行方式

  1. IDEA 右侧 Maven 面板:双击对应生命周期阶段
  2. 命令行mvn cleanmvn compilemvn package

常见问题

依赖下载失败

  • 现象:引入依赖后项目报错,jar 包找不到。
  • 原因 :网络问题导致依赖下载不完整,Maven 仓库里生成了 .lastUpdated 文件。有这个文件在,Maven 就不会重新下载。
  • 解决 :找到仓库中对应的 .lastUpdated 文件删掉,然后重新加载项目。可以批量递归删除:del /s *.lastUpdated
相关推荐
Arvin.Angela4 小时前
Maven 的基本配置操作
java·maven
戳代码的新星6 小时前
论小白如何学会使用Maven
java·maven
我登哥MVP7 小时前
SpringCloud 核心组件解析:服务注册与发现
java·spring boot·后端·spring·spring cloud·java-ee·maven
来杯@Java18 小时前
学生选课管理系统(基于springboot+vue前后端分离的项目)计算机毕业设计java
java·spring boot·spring·vue·毕业设计·maven·mybatis
我登哥MVP1 天前
Spring Boot 从“会用”到“精通”:SpringBoot MVC 请求处理全流程
java·spring boot·后端·spring·mvc·maven·intellij-idea
我登哥MVP1 天前
Spring Boot 从“会用”到“精通”:ReturnValueHandler原理
java·spring boot·后端·spring·java-ee·maven·intellij-idea
我登哥MVP1 天前
Spring Boot 从“会用”到“精通”:内容协商原理
java·spring boot·后端·spring·java-ee·maven·lua
小小放舟、2 天前
@JsonCreator 注解详解——从枚举反序列化说起
spring boot·spring·spring cloud·java-ee·maven·intellij-idea·状态模式
摇滚侠2 天前
Maven 的 <packaging>pom</packaging> 都有哪些值
java·maven