项目管理工具Maven

article/2025/8/10 8:36:20

Maven的概念

什么是Maven

什么是依赖管理

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

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

 什么是项目构建

一、项目构建的定义

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

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

  1. 传统项目构建
    • 工具与流程
      • 使用 IDE(如 Idea)手动编写源代码和配置文件。
      • 手动触发编译,通过 Junit 进行单元测试。
      • 手动将项目打包为 war 包,部署到 Tomcat 等服务器运行。
    • 特点:依赖 IDE 图形化操作,流程需手动分步完成,大型项目中协作成本较高。
  2. 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模型

 安装流程

一、安装准备

  1. 环境要求

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

    • 访问官网:Download Apache Maven – Maven
    • 选择版本 3.6.0 并下载二进制包:Index of /dist/maven/maven-3/3.6.0/binaries

二、安装步骤

  1. 解压文件

    • 将下载的压缩包解压到无中文路径的目录(如 D:\maven\apache-maven-3.6.0)。

  1. 安装目录结构

    apache-maven-3.6.0/
    ├── bin/           # Maven 运行脚本(mvn、mvnDebug)
    ├── boot/          # 类加载器框架
    ├── conf/          # 配置文件(settings.xml)
    ├── lib/           # 依赖库
    └── LICENSE.txt    # 许可证信息
    

三、环境变量配置

  1. 设置 MAVEN_HOME

    • 变量名:MAVEN_HOME
    • 变量值:Maven 解压路径(如 D:\maven\apache-maven-3.6.0

  1. 更新 Path 变量

    • 添加 %MAVEN_HOME%\bin 到系统 Path 变量末尾。

四、配置文件管理

  1. 全局配置

    • 路径:%MAVEN_HOME%\conf\settings.xml
    • 作用:所有用户共享的配置(如镜像源、本地仓库路径)。
  2. 用户配置

    • 路径:~/.m2/settings.xml(Windows:C:\Users\用户名\.m2\settings.xml
    • 作用:覆盖全局配置,仅对当前用户生效。

五、验证安装

  1. 检查版本

    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 项目的核心配置,定义项目信息和依赖:

<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>

三、示例代码

  1. 主程序类 Hello.java

    package cn.tx.maven;
    public class Hello {public String sayHello(String name) {return "Hello " + name + "!";}
    }
    
  2. 测试类 HelloTest.java

    package cn.tx.maven;
    import org.junit.Test;
    import static junit.framework.Assert.*;public class HelloTest {@Testpublic 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的第二个项目

一、项目结构与依赖配置

  1. 项目目录结构

    HelloFriend/
    ├── pom.xml
    └── src/├── main/│   ├── java/│   │   └── cn/tx/maven/HelloFriend.java│   └── resources/└── test/├── java/│   └── cn/tx/maven/HelloFriendTest.java└── resources/
    
  2. pom.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>
    

二、代码实现

  1. 主类 HelloFriend.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";}
    }
    
  2. 测试类 HelloFriendTest.java

    package cn.tx.maven;import static junit.framework.Assert.assertEquals;
    import org.junit.Test;public class HelloFriendTest {@Testpublic void tesHelloFriend() {HelloFriend helloFriend = new HelloFriend();String results = helloFriend.sayHelloToFriend("zhangsan");assertEquals("Hello zhangsan! I am John", results);}
    }
    

三、依赖问题与解决方案

  1. 错误信息

    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
    <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>

 


http://www.hkcw.cn/article/llEuVkJQyn.shtml

相关文章

使用原生前端技术封装一个组件

封装导航栏 navbar-template.html <header><nav><ul><li><a href"index.html"><i class"fas fa-home"></i> 主页</a></li><li><a href"#"><i class"fas fa-theate…

mac mini m4命令行管理员密码设置

附上系统版本图 初次使用命令行管理员&#xff0c;让输入密码&#xff0c;无论是输入登录密码还是账号密码&#xff0c;都是错的&#xff0c;百思不得其解&#xff0c;去网上搜说就是登录密码啊 直到后来看到了苹果官方的文档 https://support.apple.com/zh-cn/102367 https…

使用Vditor将Markdown文档渲染成网页(Vite+JS+Vditor)

1. 引言 编写Markdown文档现在可以说是程序员的必备技能了&#xff0c;因为Markdown很好地实现了内容与排版分离&#xff0c;可以让程序员更专注于内容的创作。现在很多技术文档&#xff0c;博客发布甚至AI文字输出的内容都是以Markdown格式的形式输出的。那么&#xff0c;Mar…

黑马k8s(十七)

一&#xff1a;高级存储 1.高级存储-pv和pvc介绍 2.高级存储-pv 3.高级存储-pvc 最后一个改成5gi pvc3是没有来绑定成功的 pv3没有绑定 删除pod、和pvc&#xff0c;观察状态&#xff1a; 4.高级存储-pc和pvc的生命周期 二&#xff1a;配置存储 1.配置存储-ConfigMap 2.配…

【ABAP 基本数据类型】

ABAP 基本数据类型 一、数值类型 1.1 整数类型 类型关键字长度值范围示例代码标准整型I4字节-2,147,483,648 到 2,147,483,647DATA lv_int TYPE i VALUE 100.短整型INT22字节-32,768 到 32,767DATA lv_short TYPE int2 VALUE -500.无符号整型INT11字节0 到 255DATA lv_flag T…

LearnOpenGL-笔记-其十一

Normal Mapping 又到了介绍法线贴图的地方&#xff0c;我感觉我已经写了很多遍了... 法线贴图用最简单的话来介绍的话&#xff0c;就是通过修改贴图对应物体表面的法线来修改光照效果&#xff0c;从而在不修改物体实际几何形状的前提下实现不同于物体几何形状的视觉效果。 因…

Scratch节日 | 粽子收集

端午节怎么过&#xff1f;当然是收粽子啦&#xff01;这款 粽子收集 小游戏&#xff0c;让你一秒沉浸节日氛围&#xff0c;轻松收集粽子&#xff0c;收获满满快乐&#xff01; &#x1f3ae; 玩法介绍f 开始游戏&#xff1a;点击开始按钮&#xff0c;游戏正式开始&#xff01;…

Linux(9)——进程(控制篇——下)

三、进程等待 1&#xff09;进程等待的必要性 之前提过子进程退出&#xff0c;父进程如果不读取子进程的退出信息&#xff0c;就可能造成“僵尸进程”的问题&#xff0c;从而造成内存泄漏的问题。再者&#xff0c;一旦子进程进入了僵尸状态&#xff0c;那就连kill -9都杀不亖…

Scratch节日 | 六一儿童节

六一儿童节到啦&#xff01;快来体验这款超简单又超好玩的 六一儿童节 小游戏吧&#xff01;只需要一只鼠标&#xff0c;就能尽情释放你的创意&#xff0c;绘出属于你自己的缤纷世界&#xff01; &#x1f3ae; 玩法介绍 鼠标滑动&#xff1a;在屏幕上随意滑动鼠标&#xff0c…

高原户外制氧机的优势特点有哪些

一、便携设计&#xff0c;突破环境限制 高原户外制氧机以轻量化、紧凑化设计为核心&#xff0c;重量普遍控制在3kg以内&#xff0c;可轻松装入背包或车载空间。采用折叠式吸氧管与一体化电源设计&#xff0c;支持太阳能充电板或车载供电&#xff0c;满足徒步、骑行、自驾等多元…

harmonyos实战关于静态图片存放以及image图片引入

编写demo轮播图的时候&#xff0c;用到图片&#xff0c;想到静态资源具体存放在哪里&#xff1f;&#xff1f; 官网工程目录结构解释&#xff1a;文档中心 Resource资源 使用资源格式可以跨包/跨模块引入图片&#xff0c;resources文件夹下的图片都可以通过$r资源接口读取到并…

LINUX530 rsync定时同步 环境配置

rsync定时代码同步 环境配置 关闭防火墙 selinux systemctl stop firewalld systemctl disable firewalld setenforce 0 vim /etc/selinux/config SELINUXdisable设置主机名 hostnamectl set-hostname code hostnamectl set-hostname backup设置静态地址 cd /etc/sysconfi…

超低延迟与高稳定性的行业领先直播解决方案

随着实时音视频技术的不断发展&#xff0c;直播行业的需求逐渐从单一的流媒体传输向更高效、更稳定、更加智能化的方向转变。作为一家创新型技术公司&#xff0c;上海视沃信息科技有限公司凭借其自研的大牛直播SDK&#xff0c;为各行业提供了一款极致体验的、低延迟、高稳定的音…

华为云Flexus+DeepSeek征文 | 基于Dify和DeepSeek-R1开发企业级AI Agent全流程指南

作者简介 我是摘星&#xff0c;一名专注于云计算和AI技术的开发者。本次通过华为云MaaS平台体验DeepSeek系列模型&#xff0c;将实际使用经验分享给大家&#xff0c;希望能帮助开发者快速掌握华为云AI服务的核心能力。 目录 1. 前言 2. 环境准备 2.1 华为云资源准备 2.1 实…

quasar electron mode如何打包无边框桌面应用程序

预览 开源项目Tokei Kun 一款简洁的周年纪念app&#xff0c;现已发布APK&#xff08;安卓&#xff09;和 EXE&#xff08;Windows&#xff09; 项目仓库地址&#xff1a;Github Repo 应用下载链接&#xff1a;Github Releases Preparation for Electron quasar dev -m elect…

Linux 中应用层自定义协议与序列化 -- 自定义协议概述,序列化和反序列化,Jsoncpp

目录 1. 应用层自定义协议概述 2. 序列化和反序列化 3. 重新理解 read, write, recv, send 以及 TCP 为什么支持全双工 4.Jsoncpp 4.1 Jsoncpp 的特性 4.2 使用 Jsoncpp 的序列化和反序列化 4.3 Json::Value 的介绍 4.3.1 构造函数 4.3.2 访问元素 4.3.3 类型检查 …

历年南京理工大学计算机保研上机真题

2025南京理工大学计算机保研上机真题 2024南京理工大学计算机保研上机真题 2023南京理工大学计算机保研上机真题 在线测评链接&#xff1a;https://pgcode.cn/school 求阶乘 题目描述 给出一个数 n n n ( 1 ≤ n ≤ 13 ) (1 \leq n \leq 13) (1≤n≤13)&#xff0c;求出它…

[JVM] JVM内存调优

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

当 Python 遇上 Go:Sponge 如何成为替代 Django/Flask 的理想选择

开篇&#xff1a;Python 老司机的自白 各位 Python 老铁们&#xff01;咱们写 Python 那叫一个"纵享丝滑"——动态类型玩到飞起&#xff0c;列表推导式秀得飞起&#xff0c;Django/Flask 一把梭&#xff0c;PyPI 库多到能砸死人&#xff01;是不是觉得自己就是代码界…

Flask与PostgreSQL交互教程

目录 1. 项目结构2. 环境准备2.1 安装依赖2.2 使用Docker启动PostgreSQL 3. 数据库配置3.1 环境变量配置3.2 数据库连接配置 4. 定义数据库模型5. 实现API接口5.1 创建用户5.2 获取所有用户5.3 获取单个用户5.4 更新用户5.5 删除用户 6. 运行应用7. API测试7.1 创建用户7.2 获取…