Maven安装、IDEA集成Maven、依赖管理、单元测试

发布于:2025-09-02 ⋅ 阅读:(18) ⋅ 点赞:(0)

Maven安装、IDEA集成Maven、依赖管理、单元测试

一、认识Maven

1.1 什么是Maven?

Maven是一个项目管理工具,可以帮助我们自动化构建、依赖管理和项目信息管理。你可以把它想象成一个"项目管家",负责帮你处理项目中的各种繁琐事务,让你专注于代码编写。

1.2 Maven的作用

Maven主要有三大作用:

  1. 方便快捷的依赖管理
    就像我们做饭需要各种食材,开发项目也需要各种"代码食材"(比如数据库驱动、工具类库等)。Maven可以自动帮你下载、管理这些依赖,不需要手动去官网下载JAR包。

  2. 标准的项目构建流程
    不管是小项目还是大项目,Maven都提供了统一的构建步骤(编译、测试、打包等),就像工厂的流水线一样标准化。

  3. 统一项目结构
    使用Maven创建的项目,目录结构都是统一的。这意味着你接手任何Maven项目时,都能快速找到各个文件的位置,就像住酒店时总能找到卫生间在哪里一样。

1.3 Maven的结构

pom.xml文件

pom.xml是Maven项目的"身份证",包含了项目的基本信息和配置。它就像项目的"简历",记录了项目叫什么名字、用了什么依赖、怎么构建等信息。

仓库的作用和查找顺序

Maven的仓库就像"食材仓库",用于存放项目所需的依赖包。查找依赖时,Maven会按照以下顺序寻找:

  1. 本地仓库:你电脑上的专属仓库(默认在~/.m2/repository),相当于你家冰箱。
  2. 中央仓库:Maven官方的全球仓库(https://mvnrepository.com/),相当于大型超市。
  3. 远程仓库:公司或团队自己搭建的仓库,相当于社区便利店。

二、安装Maven

2.1 下载Maven

从Maven官网下载:https://maven.apache.org/download.cgi
建议下载Binary zip archive版本(无需安装,解压即可用)。

2.2 配置本地仓库路径

解压后,打开conf/settings.xml文件,找到<localRepository>标签,设置本地仓库路径:

<localRepository>D:\maven-repository</localRepository>

2.3 配置阿里云私服

由于中央仓库在国外,下载依赖可能很慢。我们可以配置阿里云私服(国内镜像),就像在国内找代购一样更快:

<mirrors>标签中添加:

<mirror>
    <id>aliyunmaven</id>
    <mirrorOf>*</mirrorOf>
    <name>aliyun maven</name>
    <url>https://maven.aliyun.com/repository/public</url>
</mirror>

2.4 配置环境变量

  1. 新增系统变量MAVEN_HOME,值为Maven解压目录(如D:\apache-maven-3.8.8
  2. Path环境变量中添加%MAVEN_HOME%\bin

验证安装是否成功:打开命令行输入mvn -v,如果显示Maven版本信息则安装成功。

三、IDEA集成并创建Maven项目

3.1 更改IDEA配置

3.1.1 基本Maven配置

在IDEA欢迎页面点击Customize → All settings,依次进入:
Build,Execution,Deployment → Build Tools → Maven
配置以下三项:

  • Maven home path:Maven安装路径
  • User settings file:Maven的settings.xml文件路径
  • Local repository:本地仓库路径
3.1.2 配置JRE

进入Maven → Runner,在JRE下拉框选择已安装的JDK。

3.1.3 配置编译器版本

进入Compiler → Java Compiler,设置Project bytecode version为你的JDK版本(如11)。

3.2 创建Maven项目

  1. 在IDEA中点击New Project
  2. 选择Maven(Build system选择Maven)
  3. 选择JDK版本,填写GroupId(组织标识,如com.example)和ArtifactId(项目标识,如maven-demo
  4. 点击Create完成创建

3.3 Maven坐标

3.3.1 什么是坐标?

Maven坐标就像"快递地址",唯一标识一个依赖包。通过坐标,Maven能精准找到你需要的依赖。

3.3.2 坐标的组成部分
<groupId>com.example</groupId>    <!-- 组织/公司标识 -->
<artifactId>demo</artifactId>     <!-- 项目/模块名称 -->
<version>1.0.0</version>          <!-- 版本号 -->
<packaging>jar</packaging>        <!-- 打包类型(默认jar) -->
3.3.3 版本分类
  • RELEASE:正式版本,稳定可靠,如1.0.0
  • SNAPSHOT:快照版本,开发中的不稳定版本,如1.0.0-SNAPSHOT

四、依赖管理

4.1 添加依赖的方式

pom.xml<dependencies>标签中添加依赖:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>  <!-- 依赖范围 -->
</dependency>

4.2 排除不要的传递依赖

当A依赖B,B依赖C时,A会自动依赖C(传递依赖)。如果不需要C,可以排除:

<dependency>
    <groupId>com.example</groupId>
    <artifactId>A</artifactId>
    <version>1.0.0</version>
    <exclusions>
        <exclusion>
            <groupId>com.example</groupId>
            <artifactId>C</artifactId>
        </exclusion>
    </exclusions>
</dependency>

4.3 Maven生命周期

Maven有三套生命周期,就像游戏的不同关卡:

  1. clean:清理项目(删除编译生成的文件)
  2. default:构建项目(编译、测试、打包等核心流程)
  3. site:生成项目文档

4.4 主要生命周期阶段

阶段 作用 类比
clean 清理编译生成的文件 打扫房间
compile 编译源代码 把草稿打印成正式文档
test 运行测试代码 检查作业答案
package 打包成JAR/WAR文件 把文件整理成压缩包
install 安装到本地仓库 把做好的菜放进冰箱

注意:同一生命周期中,执行后面的阶段会自动执行前面的所有阶段。例如执行package会先执行compiletest

4.5 常见问题解决

如果依赖报错(红色下划线),可能是下载失败留下了.lastUpdated文件:

  1. 进入本地仓库目录,打开命令行
  2. 执行命令删除所有.lastUpdated文件:
    del /s *.lastUpdated
    
  3. 在IDEA中刷新Maven(右键项目 → Maven → Reload Project)

五、单元测试

5.1 测试阶段划分

软件测试就像体检,从不同角度检查软件质量:

测试阶段 说明 类比
单元测试 测试最小功能单元(如方法) 检查身体的每个器官
集成测试 测试模块之间的交互 检查器官之间的协作
系统测试 测试整个系统功能 全面体检
验收测试 用户确认软件是否满足需求 体检报告确认

测试方法:

  • 白盒测试:看代码测(如检查循环条件)
  • 黑盒测试:不看代码,只测功能(如输入输出是否正确)
  • 灰盒测试:结合白盒和黑盒(如既看接口又测功能)

5.2 单元测试的优势

main方法中测试的缺点:

  • 每次只能测试一个方法
  • 需要手动注释/取消注释代码
  • 无法批量运行多个测试用例

单元测试工具(如JUnit)的优势:

  • 可以同时测试多个方法
  • 自动生成测试报告
  • 支持断言验证结果

5.3 JUnit的使用

引入依赖

pom.xml中添加JUnit依赖:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>  <!-- 只在测试时生效 -->
</dependency>
创建测试类

src/test/java目录下创建测试类,命名规范:被测试类名+Test,如CalculatorTest

public class CalculatorTest {
    @Test  // 标记这是一个测试方法
    public void testAdd() {
        Calculator calc = new Calculator();
        int result = calc.add(2, 3);
        assertEquals(5, result);  // 断言结果是否为5
    }
}

5.4 JUnit断言

断言用于验证实际结果是否符合预期,常用断言方法:

方法 作用
assertEquals(a, b) 判断a是否等于b
assertTrue(condition) 判断条件是否为true
assertNotNull(obj) 判断对象是否不为null
assertArrayEquals(arr1, arr2) 判断数组是否相等

5.5 JUnit常用注解

注解 作用 示例
@Test 标记测试方法 @Test public void testXXX() {}
@Before 每个测试方法前执行(如初始化资源) @Before public void init() {}
@After 每个测试方法后执行(如释放资源) @After public void destroy() {}
@BeforeClass 所有测试前执行一次(静态方法) @BeforeClass public static void beforeAll() {}
@AfterClass 所有测试后执行一次(静态方法) @AfterClass public static void afterAll() {}
@Ignore 忽略该测试方法 @Ignore @Test public void testXXX() {}

注意:测试方法必须是public void,且不能有参数。

5.6 测试覆盖率

测试覆盖率表示代码被测试覆盖的比例,IDEA中查看覆盖率的方法:

  1. 右键测试类 → Run ‘XXXTest’ with Coverage
  2. 测试完成后,IDEA会显示覆盖率报告,包括:
    • 类覆盖率
    • 方法覆盖率
    • 行覆盖率

5.7 依赖范围(scope)

scope用于限制依赖的作用范围,常用取值:

scope 作用范围 示例
compile 所有阶段都可用(默认) Spring Core
test 只在测试阶段可用 JUnit
provided 编译和测试时可用,运行时由容器提供 Servlet API
runtime 运行时可用,编译时不需要 JDBC驱动
system 本地jar包(需配合systemPath使用) 本地特殊jar包