项目管理工具Maven

Maven的概念

什么是Maven

什么是依赖管理

对第三方依赖包的管理,可以连接互联网下载项目所需第三方jar包。

对自己开发的模块的管理,可以像引用第三方依赖包一样引用自己项目的依赖包。

什么是项目构建

一、项目构建的定义

项目构建是将源代码经过编译、测试、运行、打包、部署等一系列流程,最终形成可运行程序或可交付成果的过程。它涵盖从代码编写到上线的全流程自动化处理。

二、传统项目与 Maven 项目构建方式对比

传统项目构建
  • 工具与流程
    • 使用 IDE(如 Idea)手动编写源代码和配置文件。
    • 手动触发编译,通过 Junit 进行单元测试。
    • 手动将项目打包为 war 包,部署到 Tomcat 等服务器运行。
  • 特点:依赖 IDE 图形化操作,流程需手动分步完成,大型项目中协作成本较高。
Maven 项目构建
  • 标准化流程
    • 通过 Maven 将构建过程划分为多个阶段,每个阶段可通过单一命令完成:

      复制代码
      清理(clean)→ 编译(compile)→ 测试(test)→ 报告(site)→ 打包(package)→ 部署(deploy)  
    • 示例命令

      • mvn tomcat:run 直接编译、打包并部署到 Tomcat 运行。
  • 特点
    • 基于命令行操作,流程自动化程度高。
    • 标准化阶段划分,便于团队协作(如不同成员专注于编译、测试等特定阶段)。

三、Maven 项目构建的核心优势

  1. 流程标准化:统一构建步骤,避免因环境差异导致的问题。
  2. 命令行驱动:通过简单命令完成复杂流程,减少手动操作误差。
  3. 团队协作友好:标准化流程降低协作成本,适合大型项目多人开发。

总结:传统项目构建依赖手动操作和 IDE 工具,而 Maven 通过标准化流程和命令行机制,显著提升了构建效率和团队协作能力,成为现代 Java 项目的主流构建工具。

Maven的应用场景

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

为什么使用Maven

Maven模型

安装流程

一、安装准备

环境要求

  • JDK 1.8 或更高版本(需提前安装并配置好 JAVA_HOME 环境变量)。

下载 Maven

二、安装步骤

解压文件

  • 将下载的压缩包解压到无中文路径的目录(如 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 依赖解析流程

  1. 依赖查找顺序

    复制代码
    本地仓库 → 远程仓库(镜像源) → 中央仓库
  2. 镜像配置(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>
相关推荐
benpaodeDD1 小时前
IO流1——体系介绍和字节输出流
java
guitarjoy4 小时前
Compose原理 - 整体架构与主流程
java·开发语言
babicu1235 小时前
CSS Day07
java·前端·css
小鸡脚来咯5 小时前
spring IOC控制反转
java·后端·spring
怡人蝶梦7 小时前
Java后端技术栈问题排查实战:Spring Boot启动慢、Redis缓存击穿与Kafka消费堆积
java·jvm·redis·kafka·springboot·prometheus
瓯雅爱分享7 小时前
MES管理系统:Java+Vue,含源码与文档,实现生产过程实时监控、调度与优化,提升制造企业效能
java·mysql·vue·软件工程·源代码管理
鬼多不菜8 小时前
一篇学习CSS的笔记
java·前端·css
深色風信子8 小时前
Eclipse 插件开发 5.3 编辑器 监听输入
java·eclipse·编辑器·编辑器 监听输入·插件 监听输入
Blossom.1188 小时前
人工智能在智能健康监测中的创新应用与未来趋势
java·人工智能·深度学习·机器学习·语音识别