Maven的概念
什么是Maven

什么是依赖管理
对第三方依赖包的管理,可以连接互联网下载项目所需第三方jar包。
对自己开发的模块的管理,可以像引用第三方依赖包一样引用自己项目的依赖包。
什么是项目构建
一、项目构建的定义
项目构建是将源代码经过编译、测试、运行、打包、部署等一系列流程,最终形成可运行程序或可交付成果的过程。它涵盖从代码编写到上线的全流程自动化处理。
二、传统项目与 Maven 项目构建方式对比
传统项目构建
- 工具与流程 :
- 使用 IDE(如 Idea)手动编写源代码和配置文件。
- 手动触发编译,通过 Junit 进行单元测试。
- 手动将项目打包为 war 包,部署到 Tomcat 等服务器运行。
- 特点:依赖 IDE 图形化操作,流程需手动分步完成,大型项目中协作成本较高。
Maven 项目构建
- 标准化流程 :
-
通过 Maven 将构建过程划分为多个阶段,每个阶段可通过单一命令完成:
清理(clean)→ 编译(compile)→ 测试(test)→ 报告(site)→ 打包(package)→ 部署(deploy)
-
示例命令 :
mvn tomcat:run
直接编译、打包并部署到 Tomcat 运行。
-
- 特点 :
- 基于命令行操作,流程自动化程度高。
- 标准化阶段划分,便于团队协作(如不同成员专注于编译、测试等特定阶段)。
三、Maven 项目构建的核心优势
- 流程标准化:统一构建步骤,避免因环境差异导致的问题。
- 命令行驱动:通过简单命令完成复杂流程,减少手动操作误差。
- 团队协作友好:标准化流程降低协作成本,适合大型项目多人开发。
总结:传统项目构建依赖手动操作和 IDE 工具,而 Maven 通过标准化流程和命令行机制,显著提升了构建效率和团队协作能力,成为现代 Java 项目的主流构建工具。

Maven的应用场景
maven的应用场景,开发人员只要按着maven标准的目录结构进行开发即可,然后提交代码。在测试服务器上拉取Java源码,然后可以使用maven的自动化项目构建完成项目的清理、编译、测试、打包和安装部署等。

为什么使用Maven

Maven模型

安装流程
一、安装准备
环境要求
- JDK 1.8 或更高版本(需提前安装并配置好
JAVA_HOME
环境变量)。
下载 Maven
- 访问官网:Download Apache Maven -- Maven
- 选择版本 3.6.0 并下载二进制包:Index of /dist/maven/maven-3/3.6.0/binaries
二、安装步骤
解压文件
- 将下载的压缩包解压到无中文路径的目录(如
D:\maven\apache-maven-3.6.0
)。

安装目录结构
apache-maven-3.6.0/
├── bin/ # Maven 运行脚本(mvn、mvnDebug)
├── boot/ # 类加载器框架
├── conf/ # 配置文件(settings.xml)
├── lib/ # 依赖库
└── LICENSE.txt # 许可证信息
三、环境变量配置
设置 MAVEN_HOME
- 变量名:
MAVEN_HOME
- 变量值:Maven 解压路径(如
D:\maven\apache-maven-3.6.0
)

更新 Path
变量
- 添加
%MAVEN_HOME%\bin
到系统Path
变量末尾。

四、配置文件管理
全局配置
- 路径:
%MAVEN_HOME%\conf\settings.xml
- 作用:所有用户共享的配置(如镜像源、本地仓库路径)。
用户配置
- 路径:
~/.m2/settings.xml
(Windows:C:\Users\用户名\.m2\settings.xml
) - 作用:覆盖全局配置,仅对当前用户生效。
五、验证安装
检查版本
mvn -version
输出示例:
Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f; 2018-10-24T18:41:47+08:00)
Maven home: D:\maven\apache-maven-3.6.0
Java version: 1.8.0_281, vendor: Oracle Corporation

Maven的第一个项目
一、Maven 项目目录结构
Maven 项目遵循标准目录约定,主要结构如下:
Hello/ # 项目根目录
├── pom.xml # 项目配置文件
├── src/ # 源代码目录
│ ├── main/ # 主程序代码
│ │ ├── java/ # Java 源代码 (如: cn/tx/maven/Hello.java)
│ │ └── resources/ # 资源文件 (如: 配置文件)
│ └── test/ # 测试代码
│ ├── java/ # 测试代码 (如: cn/tx/maven/HelloTest.java)
│ └── resources/ # 测试资源文件
└── target/ # 编译输出目录 (自动生成)
二、pom.xml
配置文件
pom.xml
是 Maven 项目的核心配置,定义项目信息和依赖:
XML
<project xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.tx.maven</groupId> <!-- 项目组标识 (通常是域名倒序) -->
<artifactId>Hello</artifactId> <!-- 项目唯一标识符 -->
<version>0.0.1-SNAPSHOT</version> <!-- 版本号 (-SNAPSHOT 表示开发版) -->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope> <!-- 仅用于测试阶段 -->
</dependency>
</dependencies>
</project>
三、示例代码
主程序类 Hello.java
java
package cn.tx.maven;
public class Hello {
public String sayHello(String name) {
return "Hello " + name + "!";
}
}
测试类 HelloTest.java
java
package cn.tx.maven;
import org.junit.Test;
import static junit.framework.Assert.*;
public class HelloTest {
@Test
public void testHello() {
Hello hello = new Hello();
String result = hello.sayHello("maven");
assertEquals("Hello maven!", result);
}
}
maven的项目操作
打开cmd命令行,进入Hello项目根目录执行 mvn compile命令,查看根目录变化

cmd 中继续录入mvn clean命令,然后再次查看根目录变化

cmd 中录入 mvn compile命令, 查看根目录变化

cmd 中录入 mvn test命令,查看根目录变化

cmd 中录入 mvn package命令,查看根目录变化

cmd 中录入 mvn install 查看仓库会把项目安装到仓库里

Maven的第二个项目
一、项目结构与依赖配置
项目目录结构
HelloFriend/
├── pom.xml
└── src/
├── main/
│ ├── java/
│ │ └── cn/tx/maven/HelloFriend.java
│ └── resources/
└── test/
├── java/
│ └── cn/tx/maven/HelloFriendTest.java
└── resources/
pom.xml
依赖配置
XML
<dependencies>
<!-- JUnit 测试框架 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
<!-- 依赖 Hello 项目 -->
<dependency>
<groupId>cn.tx.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
二、代码实现
主类 HelloFriend.java
java
package cn.tx.maven;
public class HelloFriend {
public String sayHelloToFriend(String name) {
Hello hello = new Hello();
String str = hello.sayHello(name) + " I am " + this.getMyName();
System.out.println(str);
return str;
}
public String getMyName() {
return "John";
}
}
测试类 HelloFriendTest.java
java
package cn.tx.maven;
import static junit.framework.Assert.assertEquals;
import org.junit.Test;
public class HelloFriendTest {
@Test
public void tesHelloFriend() {
HelloFriend helloFriend = new HelloFriend();
String results = helloFriend.sayHelloToFriend("zhangsan");
assertEquals("Hello zhangsan! I am John", results);
}
}
三、依赖问题与解决方案
错误信息
Could not find artifact cn.tx.maven:Hello:jar:0.0.1-SNAPSHOT

原因 :Maven 在本地仓库中找不到 Hello
项目的 JAR 包。
2.
解决方案
-
步骤 1 :在
Hello
项目根目录执行安装命令cd Hello/ mvn clean install # 编译、测试并安装到本地仓库
-
步骤 2 :验证本地仓库
# Linux/macOS ls ~/.m2/repository/cn/tx/maven/Hello/0.0.1-SNAPSHOT/ # Windows dir %USERPROFILE%\.m2\repository\cn\tx\maven\Hello\0.0.1-SNAPSHOT\
-
步骤 3 :重新构建
HelloFriend
cd ../HelloFriend/ mvn clean package
四、Maven 依赖解析流程
-
依赖查找顺序
本地仓库 → 远程仓库(镜像源) → 中央仓库
-
镜像配置(
settings.xml
)XML<mirrors> <mirror> <id>aliyunmaven</id> <mirrorOf>*</mirrorOf> <url>https://maven.aliyun.com/repository/public</url> </mirror> </mirrors>
IDEA整合Maven项目
IDEA的Maven全局配置
启动IDEA后找到Settings

以上设置完成表示在本idea上,所有项目如未对Maven的配置进行单独配置,则默认均使用该Maven版本和本地库设置;
IDEA创建Maven的Java项目



至此Maven的Java项目创建完成

测试Maven的jar包引入

以上在IDEA上使用Maven进行Java项目的创建及测试已完成!
IDEA导入既有Maven项目
以导入刚才的Maven项目的例子做示范:






导入引入依赖Hello项目的HelloFriend项目,可以看到Hello项目已经被打成jar包引用到HelloFriend的Maven依赖中
scope
在 Java 项目中,依赖范围(Scope) 是 Maven、Gradle 等构建工具中的重要概念,用于控制依赖的 可见性 、生命周期 和 打包行为。合理设置依赖范围可以避免类冲突、减小打包体积,并确保项目结构清晰。
一、Maven 中的主要 Scope
Maven 定义了 6 种依赖范围,最常用的是以下 4 种:
1. compile
(默认)
- 可见性 :主代码(
src/main
)和测试代码(src/test
)均可使用。 - 生命周期:编译、测试、运行时均有效。
- 打包:会被包含在最终的 JAR/WAR 文件中。
- 示例:Spring 框架、Jackson 等生产环境必需的依赖。
2. test
- 可见性 :仅测试代码(
src/test
)可用。 - 生命周期:仅测试编译和运行时有效。
- 打包:不会被打包到最终产物中。
- 示例:JUnit、Mockito 等测试框架。
3. provided
- 可见性:主代码和测试代码均可使用。
- 生命周期:编译和测试时有效,但运行时由容器提供(如 Servlet API)。
- 打包:不会被打包(因为运行环境已提供)。
- 示例:Java EE API、Servlet API(如 Tomcat 已包含)。
4. runtime
- 可见性:测试代码和运行时可用,主代码编译时不需要(如 JDBC 驱动)。
- 生命周期:测试和运行时有效。
- 打包:会被包含在最终产物中。
- 示例:JDBC 驱动、Hibernate 运行时依赖。
示例对比
假设使用 Maven 管理依赖:
原配置(test
范围)
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.8.2</version>
<scope>test</scope> <!-- 仅测试代码可用 -->
</dependency>
修改后(compile
范围)
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.8.2</version>
<!-- 默认scope为compile,主代码和测试代码均可使用 -->
</dependency>
