项目管理工具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>
相关推荐
坐吃山猪4 小时前
SpringBoot01-配置文件
java·开发语言
我叫汪枫4 小时前
《Java餐厅的待客之道:BIO, NIO, AIO三种服务模式的进化》
java·开发语言·nio
yaoxtao4 小时前
java.nio.file.InvalidPathException异常
java·linux·ubuntu
Swift社区6 小时前
从 JDK 1.8 切换到 JDK 21 时遇到 NoProviderFoundException 该如何解决?
java·开发语言
DKPT7 小时前
JVM中如何调优新生代和老生代?
java·jvm·笔记·学习·spring
phltxy7 小时前
JVM——Java虚拟机学习
java·jvm·学习
seabirdssss8 小时前
使用Spring Boot DevTools快速重启功能
java·spring boot·后端
喂完待续8 小时前
【序列晋升】29 Spring Cloud Task 微服务架构下的轻量级任务调度框架
java·spring·spring cloud·云原生·架构·big data·序列晋升
benben0448 小时前
ReAct模式解读
java·ai