Maven的概念与初识Maven

目录

一、Maven的概念

1. 什么是Maven

2. 项目构建:从代码到部署的标准化流程

2.1 Maven构建生命周期

2.2 传统构建 vs Maven构建

3. 依赖管理:解决“JAR地狱”的利器

3.1 依赖声明

3.2 依赖传递与冲突解决

4. Maven仓库:依赖的存储与分发

4.1 仓库类型

4.2 配置镜像仓库

5. Maven模型

二、初识Maven

1. 安装Maven

1.1 环境准备

1.2 配置步骤

2. 创建第一个Maven项目

2.1 项目结构

2.2 编写POM文件

2.3 编写代码与测试

2.4 构建与运行

3. Maven的第二个项目

3.1 项目结构

3.2 编写POM文件

3.3 编写代码与测试

3.4 测试打包HelloFriend项目

四、常见问题与解决方案

五、总结


一、Maven的概念

1. 什么是Maven

1.1 Maven(意为“专家”)是一款专为Java项目设计的跨平台项目管理工具,核心功能包括:

  • 项目构建:自动化编译、测试、打包、部署。

    • 理想的项目构建:高度自动化,跨平台,可重用的组件,标准化的流程

  • 依赖管理:自动下载和管理第三方库(JAR包)。

  • 项目信息管理:统一维护项目元数据(如版本、开发者信息)。

1.2 为什么需要Maven?

  • 传统构建的痛点

    • 手动操作:开发人员需手动编译、测试、部署,效率低。

    • 依赖混乱:JAR包版本冲突,难以维护。

    • 缺乏标准化:不同开发者的环境配置差异导致协作困难。

  • Maven的解决方案

    • 约定优于配置:默认目录结构(如src/main/java)减少配置成本。

    • 生命周期管理:通过命令(如mvn compile)自动化执行构建流程。

    • 中央仓库支持:从全球仓库自动下载依赖,避免手动管理。

2. 项目构建:从代码到部署的标准化流程

2.1 Maven构建生命周期

Maven定义了三套生命周期,每个生命周期包含多个阶段(Phase):

  1. Clean:清理项目(删除target目录)。

  2. Default:核心构建流程(编译、测试、打包、安装)。

  3. Site:生成项目文档站点。

典型构建阶段

mvn clean       # 清理
mvn compile     # 编译主代码
mvn test        # 运行单元测试
mvn package     # 打包为JAR/WAR
mvn install     # 安装到本地仓库
mvn deploy      # 部署到远程仓库

2.2 传统构建 vs Maven构建

步骤传统方式Maven方式
编译手动执行javacmvn compile
测试手动运行JUnit测试类mvn test(自动执行所有测试)
依赖管理手动下载并配置JAR包声明依赖,Maven自动下载
打包手动生成JAR/WAR文件mvn package(按POM配置生成包)

3. 依赖管理:解决“JAR地狱”的利器

3.1 依赖声明

pom.xml中通过坐标(GAV)声明依赖:

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope>
</dependency>
  • GAVgroupId(组织标识)、artifactId(项目名)、version(版本)。

  • scope:控制依赖的作用范围(如test表示仅测试阶段有效)。

3.2 依赖传递与冲突解决

  • 依赖传递:若A依赖B,B依赖C,则A自动引入C。

  • 冲突解决:Maven采用最短路径优先先声明优先原则,避免版本冲突。

4. Maven仓库:依赖的存储与分发

4.1 仓库类型

  1. 本地仓库:默认位于~/.m2/repository,缓存下载的依赖。

  2. 远程仓库

    • 中央仓库:Maven官方维护,包含绝大多数开源库。

    • 私服:企业内部搭建,加速依赖下载并管理私有组件。

4.2 配置镜像仓库

settings.xml中配置阿里云镜像加速下载:

<mirror><id>aliyun</id><name>Aliyun Maven</name><url>https://maven.aliyun.com/repository/public</url><mirrorOf>central</mirrorOf>
</mirror>

5. Maven模型

二、初识Maven

1. 安装Maven

1.1 环境准备

  • JDK 1.8+:确保JAVA_HOME环境变量正确配置。

  • 下载Maven:从官网下载二进制包(如apache-maven-3.8.6-bin.zip)。

1.2 配置步骤

  1. 解压到无中文路径:如D:\Tools\apache-maven-3.8.6

  2. 设置环境变量

    • MAVEN_HOME:Maven解压目录。

    • Path:添加%MAVEN_HOME%\bin

  3. 验证安装

mvn -v
# 输出示例:Apache Maven 3.8.6 ... Java version: 17.0.5

2. 创建第一个Maven项目

2.1 项目结构

Maven强制约定目录结构,确保标准化:

Hello
├── src
│   ├── main
│   │   ├── java         # Java源代码
│   │   └── resources    # 配置文件(如log4j.properties)
│   └── test
│       ├── java         # 测试代码
│       └── resources    # 测试配置
├── target               # 构建输出(编译后的类、JAR包)
└── pom.xml              # 项目对象模型(核心配置文件)

2.2 编写POM文件

<project xmlns="http://maven.apache.org/POM/4.0.0"           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"                           xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>cn.tx.maven</groupId><artifactId>Hello</artifactId><version>0.0.1-SNAPSHOT</version><name>Hello</name><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.9</version><scope>test</scope></dependency>		</dependencies>
</project>

2.3 编写代码与测试

(1)主类:在src/main/java/cn/tx/maven目录下新建文件Hello.java

package cn.tx.maven;
public class Hello {public String sayHello(String name){return "Hello "+name+"!";}
}

(2)测试类:在/src/test/java/cn/tx/maven目录下新建测试文件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 results = hello.sayHello("maven");assertEquals("Hello maven!",results);		}
}

2.4 构建与运行

  • 打开cmd命令行,进入Hello项目根目录执行 mvn compile命令,查看根目录变化
  • cmd 中继续录入mvn clean命令,然后再次查看根目录变化
  • cmd 中录入 mvn clean compile命令, 查看根目录变化
  • cmd 中录入 mvn clean test命令,查看根目录变化
  • cmd 中录入 mvn clean package命令,查看根目录变化
  • cmd 中录入 mvn clean install 查看仓库会把项目安装到仓库里

3. Maven的第二个项目

3.1 项目结构

HelloFriend
├── src
│   ├── main
│   │   ├── java         # Java源代码
│   │   └── resources    # 配置文件(如log4j.properties)
│   └── test
│       ├── java         # 测试代码
│       └── resources    # 测试配置
├── target               # 构建输出(编译后的类、JAR包)
└── pom.xml              # 项目对象模型(核心配置文件)

3.2 编写POM文件

<project xmlns="http://maven.apache.org/POM/4.0.0"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>cn.tx.maven</groupId><artifactId>HelloFriend</artifactId><version>0.0.1-SNAPSHOT</version><name>HelloFriend</name><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.9</version><scope>test</scope></dependency>		<dependency><groupId>cn.tx.maven</groupId><artifactId>Hello</artifactId><version>0.0.1-SNAPSHOT</version><scope>compile</scope></dependency>		</dependencies>
</project>

3.3 编写代码与测试

(1)主类:在src/main/java/cn/tx/maven目录下新建文件HelloFriend.java

package cn.tx.maven;import cn.tx.maven.Hello;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)测试类:在/src/test/java/cn/tx/maven目录下新建测试文件HelloFriendTest.java

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

3.4 测试打包HelloFriend项目

在HelloFriend目录下执行命令mvn package

四、常见问题与解决方案

  1. 依赖下载失败

    • 检查镜像配置:确保settings.xml中配置了可靠的镜像源(如阿里云)。

    • 清理本地仓库:删除~/.m2/repository中损坏的依赖目录,重新下载。

  2. 构建时报错“找不到符号”

    • 检查JDK版本:确保POM中配置的JDK版本与环境一致。

    • 重新编译:执行mvn clean compile

  3. 插件兼容性问题

    • 更新插件版本:在Maven中央仓库查找最新版本。

五、总结

Maven通过标准化构建流程自动化依赖管理,极大提升了Java项目的开发效率与协作能力。从安装配置到创建第一个项目,再到管理复杂依赖,Maven始终是开发者不可或缺的工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/80558.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity-Shader详解-其二

前向渲染和延迟渲染 前向渲染和延迟渲染总的来说是我们的两种主要的渲染方式。 我们在Unity的Project Settings中的Graphic界面能够找到渲染队列的设定&#xff1a; 我们也可以在Main Camera这里进行设置&#xff1a; 那这里我们首先介绍一下两种渲染&#xff08;Forward R…

C++ 中 std::tuple 使用详解

C 中 std::tuple 使用详解 基本概念 std::tuple 是 C11 引入的模板类&#xff0c;用于打包任意数量、任意类型的值在一起。可看作是类型安全的变长结构体。 #include <tuple>std::tuple<int, std::string, double> t(42, "hello", 3.14);创建 tuple 的…

WebRTC基于网页的视频会议,手写WebRTC流程(html)

WebRTC是web real-time communication网页及时通信的缩写&#xff0c;通过javascript就可以实现网页会话&#xff0c;基于浏览器开发出来多媒体应用&#xff0c; 以下是手写的WEBRTC调用本地摄像头的html代码&#xff0c;直接用浏览器打开&#xff0c;就可以使用 <!DOCTYPE…

MyBatis 官方子项目详细说明及表格总结

MyBatis 官方子项目详细说明及表格总结 1. 核心子项目说明 1.1 mybatis-3 GitHub 链接&#xff1a;https://github.com/mybatis/mybatis-3功能&#xff1a; MyBatis 核心框架的源码&#xff0c;提供 SQL 映射、动态 SQL、缓存、事务管理等核心功能。主要功能&#xff1a; 支持…

【虚幻C++笔记】碰撞检测

目录 碰撞检测参数详情示例用法 碰撞检测 显示名称中文名称CSphere Trace By Channel按通道进行球体追踪UKismetSystemLibrary::SphereTraceSingleSphere Trace By Profile按描述文件进行球体追踪UKismetSystemLibrary::SphereTraceSingleByProfileSphere Trace For Objects针…

推论阶梯——AI与思维模型【81】

一、定义 推论阶梯思维模型是一种用于分析和理解人们如何从观察到的事实,经过一系列的假设、推理和判断,最终得出结论的思维过程的理论框架。它将这个过程比喻为一个阶梯,每一步都建立在前一步的基础上,逐渐形成一个完整的推论。这个模型帮助我们意识到在思考和决策过程中…

小刚说C语言刷题——1109加密四位数

1.题目描述 某军事单位用 4位整数来传递信息&#xff0c;传递之前要求先对这个 4 位数进行加密。加密的方式是每一位都先加上 5然后对 10取余数&#xff0c;再将得到的新数颠倒过来。 例如&#xff1a;原数是 1379 &#xff0c;那么每位加 55对 10 取余数的结果为 6824 &…

云服务器和独立服务器的区别在哪

在当今数字化的时代&#xff0c;服务器成为了支撑各种业务和应用的重要基石。而在服务器的领域中&#xff0c;云服务器和独立服务器是两个备受关注的选项。那么&#xff0c;它们到底有何区别呢&#xff1f; 首先&#xff0c;让我们来聊聊成本。云服务器通常采用按需付费的模式…

【前端】【业务场景】【面试】在前端开发中,如何优化 SVG(可缩放矢量图形)的性能,特别是在处理复杂图形和动画时

SVG 性能优化&#xff1a;循序渐进 4 步法 目标&#xff1a;先减负 → 再复用 → 后加速 → 最后按场景微调 ① 精简—把包袱先丢掉 删除无用元素 隐藏/被遮挡的 <path>、未引用的 <defs> 里渐变、滤镜。 合并路径 同填充色或描边的路径 ⇒ SVGO / SVGOMG「Mer…

MySQL长事务的隐患:深入剖析与解决方案

MySQL长事务的隐患&#xff1a;深入剖析与解决方案 一、什么是长事务&#xff1f; 在数据库系统中&#xff0c;长事务(Long Transaction)通常指执行时间超过预期或系统设定阈值的事务。对于MySQL而言&#xff0c;虽然没有严格的时间定义&#xff0c;但一般认为执行时间超过数…

华为AR1200 telnet设置

华为路由配置TELNET登 &#x1f4fa; 启动TELNET服务 在华为路由器上启动TELNET服务&#xff0c;执行以下命令&#xff1a; telnet server enable &#x1f511; 配置AAA认证 进入AAA认证配置&#xff0c;创建一个路由器登录帐号admin123&#xff0c;并设置密码为huawei123&…

【Token系列】01 | Token不是词:GPT如何切分语言的最小单元

文章目录 01 | Token不是词&#xff1a;GPT如何切分语言的最小单元&#xff1f;一、什么是 Token&#xff1f;二、Token 是怎么来的&#xff1f;——BPE算法原理BPE核心步骤&#xff1a; 三、为什么不直接用词或字符&#xff1f;四、Token切分的实际影响五、中文Token的特殊性六…

如何快速高效学习Python?

如何快速高效学习Python&#xff1f; How to Fastly and Effectively Learn Python Programming? By JacksonML 1. Python年轻吗&#xff1f; Python自1991年诞生到现在&#xff0c;已经经历了三十四年或者更长时间了。毕竟&#xff0c;Python之父 – 吉多范罗苏姆先生(Gu…

NAT穿透

NAT是 Net Address Traslation的缩写&#xff0c;即网络地址转换 NAT部署在网络出口的位置。位于内网和公网之间&#xff0c;是连接内挖个主机和公网的桥梁&#xff0c;双向流量都必须经过NAT&#xff0c;装有NAT软件的路由器叫NAT路由器&#xff0c;NAT路由器拥有公网Ip NAT解…

搜索引擎的高级语法

文章目录 精确搜索&#xff1a;双引号站内搜索&#xff1a;site通配符搜索&#xff1a;*减号缩小范围&#xff1a;-文档搜索&#xff1a;filetypeURL搜索&#xff1a; inurl标题搜索&#xff1a;intitle正文搜索&#xff1a;intext参考链接 精确搜索&#xff1a;双引号 “ ” …

RAG vs 微调:大模型知识更新的最优解之争

一、技术本质&#xff1a;知识注入的两条路径 在大模型应用落地的实践中&#xff0c;RAG&#xff08;检索增强生成&#xff09;与微调&#xff08;Fine-tuning&#xff09;已成为知识更新的两大核心技术路径。二者的本质差异在于是否对模型参数进行修改&#xff1a; 维度RAG微…

解释器体系结构风格-笔记

解释器&#xff08;Interpreter&#xff09;是一种软件设计模式或体系结构风格&#xff0c;主要用于为语言&#xff08;或表达式&#xff09;定义其语法、语义&#xff0c;并通过解释器来解析和执行语言中的表达式。解释器体系结构风格广泛应用于编程语言、脚本语言、规则引擎、…

浏览器f12可以搜索接口的入参 和返回内容

浏览器f12可以搜索接口的入参 和返回内容

vue3+element-push 实现input框粘贴图片或文本,图片上传。

vue3element-push 实现input框粘贴图片或文本&#xff0c;图片上传。 <el-inputstyle"height: 100px; width: 100%"paste.capture.prevent"pasting"v-model"textMsg"placeholder"请输入"/>// 展示上传的列表--可不要<divsty…

高效使用DeepSeek对“情境+ 对象 +问题“型课题进行开题!

目录 思路"情境 对象 问题"型 课题选题的类型有哪些呢&#xff1f;这要从课题题目的构成说起。通过对历年来国家社会科学基金立项项目进行分析&#xff0c;小编发现&#xff0c;课题选题类型非常丰富&#xff0c;但一般是围绕限定词、研究对象和研究问题进行不同的组…