1 Maven概述
1.1 为什么使用Maven
- 添加第三方jar包。通过坐标引用jar包。
- jar包间的依赖关系。通过Maven管理包之间的依赖。
- 管理jar包之间的冲突。自动处理jar包间的冲突。
- 获取第三方jar包。从中央仓库获取规范的jar包。
- 将项目拆分成多个工程模块。多个module间使用Maven进行管理,多个package(MVC分层等)。
- 实现项目分布式部署。不同的module在不同的服务器上运行。
2 Maven是什么
2.1 自动化构建工具
2.2 什么是构建
- 编写代码通过Maven的框架,构建一个可部署的项目(jar包)
2.3 构建的重要环节
- 清理(clean)
- 编译(test-compile)
- 测试(test)
- 报告
- 打包(package)
- 安装(install)
- 部署(deploy)
2.4 自动化构建
2.5 Maven的核心概念
- POM
- 约定的目录结构
- 坐标
- 依赖管理
- 生命周期
- 插件和目标
- 继承
- 聚合
3 如何使用Maven
3.1安装Maven核心程序
- JAVA_HOME环境变量配置
- 将apache-maven-3.5.4-bin.zip解压到非中文无空格目录
- 配置M2_HOME环境变量目录\apache-maven-3.5.4
- 配置Path:%M2_HOME%\bin
- dos中输入mvn -v查看是否安装成功
3.2 第一个Maven工程(Hello)
1 约定的目录结构
Hello
src
main
resources
tset
main
resources
pom.xml
2 创建Maven的核心配置文件pom.xml
<?xml version="1.0" ?>
<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.atguigu.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Hello</name>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
3 编写主代码
package com.atguigu.maven;
public class Hello {
public String sayHello(String name){
return "Hello "+name+"!";
}
}
4 编写测试程序代码
package com.atguigu.maven;
import org.junit.Test;
import static junit.framework.Assert.*;
public class HelloTest {
@Test
public void testHello(){
Hello hello = new Hello();
String results = hello.sayHello("atguigu");
assertEquals("Hello atguigu!",results);
}
}
5 运行基本的Maven命令(dos窗口)
// 运行前需要进入到pom.xml目录下
mvn compile //编译
mvn clean // 清理
mvn test-compile // 编译测试程序
mvn test // 测试程序
mvn package // 打包
mvn install // 程序jar包放到本地仓库
3.3 Maven联网问题
1 配置本地仓库
- 默认的本地仓库:用户.m2\repository
- 核心配置文件目录:解压目录的conf\settings.xml
- 在settings.xml中添加本地仓库路径
<localRepository>本地仓库路径</localRepository>
2 配置阿里云镜像,不使用中央仓库
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
3.4 IDEA中配置Maven
1 设置安装目录和本地仓库

2 配置Maven自动导入jar包

3 在File - Other Settings - Settings for New Projects设置以上操作
3.5 创建Maven Module
- 先创建Empty Project
- 创建Maven模块
- 配置pom.xml
- 编写主代码
- 编写测试代码
- 运行Maven工程
3.6 Maven打包插件
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<!-- 指定主类 -->
<mainClass>xxx.xxx.XXX</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
4 Maven的核心概念
4.1 POM
- Project Object Module项目对象模型。将Java工程的相关信息封装为对象作为便于操作和管理的模型
- pom.xml的大致结构
<project...>
<modelVersion>...</modelVersion>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<properties>
<xxx.version>...</xxx.version>
</properties>
<dependencies>
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<scope>...</scope>
</dependency>
<exclusions>
<exclusion>
<groupId>...</groupId>
<artifactId>...</artifactId>
</exclusion>
</exclusions>
</dependencies>
<build>
<plugins>
<plugin>...<plugin>
</plugins>
</build>
<reporting>
</reporting>
</project>
4.2 约定的目录结构
- 约定 > 配置 > 编码。有了约定,就可以不进行配置,是自动化构建的前提
4.3 坐标
1 module的坐标
<project...>
...
<groupId>com.atguigu.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
...
</project>
2 依赖的坐标
<project...>
...
<dependencies>
<dependency>
<groupId>com.atguigu.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
</dependencies>
...
</project>
4.4 依赖管理
1 依赖的范围
- 常见的有 compile、test、provided 还有runtime、import、system等
- 写在标签中

2 依赖的传递性
直接依赖和间接依赖
- A<---B<---C。C直接依赖于B,B直接依赖于A,C间接依赖于A。
好处
- 可以传递的依赖(非compile依赖),不必在每个模块重复声明,最下面的工程依赖一次即可。
注意
- 非compile依赖不能传递。所以各个工程模块中,如果有需要,就要重复声明该依赖。
3 依赖的原则
- 路径段优先
- 配置文件中声明顺序优先
- 同时需要考虑依赖的范围
4 依赖的排除
- 如果B不想使用A中的某个依赖a,而A中的该依赖a是compile的且无法修改的,则需要使用exclusions来排除该依赖。且被B依赖的C也被排除了。注:标签声明在标签下

5 统一管理目标jar包版本
- 如果配置中有同一版本的不同jar包,使用标签来自定义依赖的版本<xxx.version>版本号</xxx.version>,在每个依赖中,使用${spring.version}来统一修改
<project>
<properties>
<spring.version>4.0.0.RELEASE</spring.version>
</properties>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
</project>
4.5 仓库
1 本地仓库
2 远程仓库
- 私服(局域网)
- 中央仓库(Internet上)
- 中央仓库镜像(各大洲,例如阿里云镜像)
3 仓库的内容
- Maven插件
- 自己编写的项目module
- 第三方框架或工具jar包
4.6 生命周期
- Clean LifeCycle:构建前的清理工作
- 三个阶段:pre-clean、clean、post-clean
- Default LifeCycle:构建的核心工作:编译、测试、打包、安装、部署等
- compile编译主程序
- test-comply编译测试程序
- test进行测试
- package打包
- install安装到本地仓库
- Site LifeCycle:生成项目报告,站点,发布站点
- pre-site、site、post-site、site-depoly
4.7 插件和目标(plugin and target)
- Maven的核心,每个生命周期的每个步骤都是由插件完成的
- 每个插件有多个功能,每个功能完成一个步骤
- compile是maven-compiler-plugin的一个功能,pre-clean是maven-clean-plugin的一个目标
5 继承
- 说明:
- test范围依赖(例如junit)不能传递,各个工程都有一样的该依赖,容易造成版本不一致。
- 例如:Hello(junit 4.0) <--- HelloFriend(junit 4.0) <--- MakeFriends(junit 4.9)
- 解决方案:
- 将junit提取到父工程,,在子工程中声明junit的版本即可,同时也便于修改。
- 操作步骤:
- 创建父工程Parent,打包方式Packaging选pom。pom
- 子工程在标签中声明父工程的引用,并加上(以当前文件为基准的父工程pom.xml文件的)相对路径 ...标签
- 子工程的坐标中的,与父工程坐标中重复的内容删除(各子工程的g和v部分)
- 父工程中统一junit的依赖
- 子工程中删除junit依赖的版本号部分
- 配置继承后,执行安装命令前要先安装父工程。
<project>
<packaging>pom</packaging>
<dependencyManagement>
<dependencies>
<dependency>
<g, a, v />
<scope>4.9</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
<project>
<parent>
<relativePath>../Parent/pom.xml</relativePath>
</parent>
<dependencies>
<dependency>
<g, a, v />
</dependency>
</dependencies>
</project>
6 聚合
- 作用:一键安装各个模块工程
- 配置方式:在一个总的聚合模块中配置各个参与聚合的模块,父工程也可以做为聚合模块。在标签中加入各个需要聚合的模块,每个中填入各个模块相对于聚合模块的相对路径。
<project>
<modules>
<module></module>
<module></module>
<module></module>
</modules>
</project>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)