Maven入门(够用)
1、Maven是什么?
这个问题非常不重要,或者说不应该上来就问maven是什么,而是直接学习maven怎么用能干什么,学完之后自然就知道了maven是个什么玩意儿,很多技术都是如此。
2、Maven下载
先准备Java环境,安装JDK,配置JDK环境变量。如果是windows系统,去maven官网下载zip版本,解压缩之后配置Maven环境变量就可以使用了。
- **本地仓库地址:**创建一个文件夹当作本地仓库,存放下载的依赖,在conf/setting.xml中修改配置
- **maven镜像:**本地没有的jar包,maven会去官网下载,maven官网在国外所以下载比较慢,可以配置国内的maven镜像,访问速度会快一点。docker也是类似,有镜像服务器。在setting.xml中配置镜像源就行了,可以多配置几个镜像源。
- **pom.xml:**Maven配置文件,学习maven主要就是学习如何读写项目的pom.xml文件
- maven项目结构:
- **target:**编译后的文件放到target中。
3、pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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>com.example</groupId><artifactId>untitled</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.23</version></dependency><dependency><groupId>org.jetbrains</groupId><artifactId>annotations</artifactId><version>26.0.1</version><scope>compile</scope></dependency></dependencies><dependencyManagement><dependencies></dependencies></dependencyManagement>
</project>
一个简单的pom.xml文件就张上面这个样子。
- modelVersion标签不用管
- groupId、artifactId、version这三个是依赖的坐标信息,类似于空间直角坐标系中的x、y、z可以确定空间中的一个点,者三个标签可以唯一确定一个依赖。(依赖就是别人写的代码,我们直接引入直接拿来用)groupId一般是域名、artifactId一般使用项目名称、version是版本号。
- properties标签这里我们可以去设置JDK版本、字符集等等,还可以去声明依赖的版本,对版本进行统一管理。
- dependencies、dependencie就是引入依赖的标签
- dependencyManagement也是用于引入依赖的标签
4、依赖范围
前面说了,依赖就是别人写的代码,就是我们的代码需要使用别人的代码,我们才会引入相应的依赖。有时候我们会直接业务代码中使用别人的代码。如spring-code;有时候是在测试代码中使用,如Juint。这就是两种不同的范围,在业务代码中使用不到Juint依赖的,所以可以设置Juint依赖只在测试代码中可以被使用。业务代码可以被使用我们称之为运行范围、测试代码中可以被使用称之为测试范围。除此之外还有编译范围,就是要不要编译引入的依赖。打包范围,打包时要不要包含引入的依赖。
如何设计某个依赖的范围呢,maven提供了scope标签,scope需要在dependencie标签中使用。形如:
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>RELEASE</version><scope>test</scope>
</dependency>
下表时不同值对应的作用域:
作用域scope | 编译 | 测试 | 运行 | 打包 | 实例 |
---|---|---|---|---|---|
compile | ![]() | ![]() | ![]() | ![]() | Spring-core |
test | ![]() | ![]() | ![]() | ![]() | junit |
runtime | ![]() | ![]() | ![]() | ![]() | JDBC |
provided | ![]() | ![]() | ![]() | ![]() | Sevlet api |
system | ![]() | ![]() | ![]() | ![]() |
5、maven命令
上图就是maven的一些命令,这些命令是一个生命周期,运行下面的某命令时就会先从clean命令开始一次运行。
- **clean:**清除上一次构建生成的所有文件和目录,比如项目的目标目录(通常是
target
目录),该目录中存放着编译后的类文件、生成的 JAR 包、WAR 包等。通过执行clean
,可以确保每次构建都是从一个干净的状态开始,避免因残留文件导致的构建问题 。 - **validate:**验证项目是否正确并且所有必要的信息都可用。例如,检查项目的 POM 文件是否格式正确,依赖是否配置合理等。但这个阶段不会去下载依赖或者进行实际的构建操作。
- **complie:**编译项目的主源代码(通常是
src/main/java
目录下的 Java 源文件),将 Java 源文件编译成字节码文件(.class
文件),并将编译后的文件放到项目的目标目录(target/classes
)中。 - **test:**使用合适的单元测试框架(如 JUnit)运行测试类(通常在
src/test/java
目录下),对编译后的代码进行单元测试 。但不会对测试代码进行打包等后续操作,只是单纯运行测试来验证功能是否正确。 - **package:**将编译后的代码(包括主代码和可能的资源文件)按照项目指定的打包方式进行打包,比如生成 JAR 包(适用于 Java 类库项目)、WAR 包(适用于 Web 应用项目)或者 EAR 包(适用于企业级 Java 应用项目)等,生成的包会放在目标目录(
target
目录)中。 - **verify:**运行所有检查,验证包是否有效且达到质量标准。例如,检查生成的包是否可以正确解压、包中的元数据是否完整等,还可以结合代码质量检查工具(如 Checkstyle、FindBugs 等)对代码进行进一步的质量验证。
- **install:**将打包好的包安装到本地仓库中,供本地其他项目进行依赖引用。对于 Java 项目,就是将生成的 JAR、WAR 等包安装到本地 Maven 仓库(默认路径在用户主目录下的
.m2/repository
目录),方便在其他项目中通过配置依赖来使用这个项目的功能。 - **site:**生成项目的站点文档,Maven 会根据项目中的各种信息(如项目描述、模块信息、依赖信息、测试报告等)生成一个 HTML 格式的站点,帮助团队成员和外部使用者了解项目的详细情况。
- **deploy:**将最终的包发布到远程仓库(如公司的私服,或者公开的 Maven 中央仓库等),供其他开发人员或者项目进行依赖引用。通常在项目正式发布或者版本更新时执行这个阶段,以便让其他项目可以获取到最新版本的包 。
6、依赖的传递、排除与覆盖
简单讲就是A依赖B,B依赖C,A就自动会依赖C。当然A也可以手动排除C或者覆盖C。
依赖的排除示例(删除exclusions标签依赖就会传递):
<dependencies><dependency><groupId>com.example</groupId><artifactId>demo1</artifactId><version>1.0-SNAPSHOT</version><exclusions><exclusion><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId></exclusion></exclusions></dependency>
</dependencies>
依赖的覆盖示例:
<dependencies><!-- 假设demo1依赖了servlet的某个旧版本 --><dependency><groupId>com.example</groupId><artifactId>demo1</artifactId><version>1.0-SNAPSHOT</version></dependency><!-- 这里引入一个新的版本就会对旧版本进行覆盖 --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version></dependency></dependencies>
这个命令可以查看项目的依赖关系:
mvn dependency:tree
7、Maven继承
一个项目往往会有多个模块,每一个模块都是使用maven进行依赖管理的,也就是每一个模块都是有一个唯一坐标信息的。两个模块之间可以是继承关系,比如S1模块和S2模块都继承了F模块。
那么在F中使用引入的依赖会被S1和S2直接继承。有时候父模块中的依赖并不都是要继承给子模块的。此时父模块可以使用 标签来引入依赖,这样就不会被子模块自动继承了,而子模块可以选择性的进行继承,且不需要指明具体的版本号,因为父模块已经声明过了。
父模块引入servlet依赖:
<dependencyManagement><dependencies><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version></dependency></dependencies></dependencyManagement>
子模块选择性继承(不需要指明版本号了):
<dependencies><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId></dependency></dependencies>
PS:根项目也是可以继承maven配置的。
相关文章:

Maven入门(够用)
1、Maven是什么? 这个问题非常不重要,或者说不应该上来就问maven是什么,而是直接学习maven怎么用能干什么,学完之后自然就知道了maven是个什么玩意儿,很多技术都是如此。 2、Maven下载 先准备Java环境,安…...
【HarmonyOS 5】 社交行业详解以及 开发案例
HarmonyOS 5通过分布式能力、响应式框架及AI技术,重构社交应用的交互范式,以下是分领域解析: 🧏 一、无障碍社交创新 听障人士实时通讯辅助 语音文字双向转译功能:对方语音实时转为文字显示,用户…...
python版若依框架开发:集成Dash应⽤
python版若依框架开发 从0起步,扬帆起航。 python版若依部署代码生成指南,迅速落地CURD!项目结构解析前端开发规范后端开发规范集成Dash应⽤文章目录 python版若依框架开发后端部分1.安装 Dash2.在 sub_applications 目录下新建 dash_app.py ⽂件3.在 sub_applications/han…...
网盘变硬盘挂载软件:百度 / 阿里 / OneDrive 秒变本地磁盘
各位网盘达人们!今天咱来聊聊超神奇的网盘挂载软件。你知道吗,这玩意儿就像个超级魔法棒,能把远程网盘,像百度网盘、阿里云盘、OneDrive这些,变成咱本地的虚拟磁盘。有了它,咱管理云端文件就跟操作自己家硬…...

自动化办公集成工具:一站式解决文档处理难题
1. 项目概述 在当今信息化时代,办公自动化已成为提升工作效率的关键。本文将详细介绍一款基于Python和PyQt5开发的「自动化办公集成工具」,该工具集成了多种常用的办公文档处理功能,包括批量格式转换、文本智能替换、表格数据清洗等,旨在为用户提供一站式的办公自动化解决方…...

three.js 零基础到入门
three.js 零基础到入门 什么是 three.js为什么使用 three.js使用 Three.js1. 创建场景示例 2.创建相机3. 创建立方体并添加网格地面示例 5. 创建渲染器示例 6. 添加效果(移动/雾/相机跟随物体/背景)自动旋转示例效果 相机自动旋转示例 展示效果 实现由远到近的雾示例展示效果 T…...

PublishSubject、ReplaySubject、BehaviorSubject、AsyncSubject的区别
python容易编辑,因此用pyrx代替rxjava3做演示会比较快捷。 pyrx安装命令: pip install rx 一、Subject(相当于 RxJava 的 PublishSubject) PublishSubject PublishSubject 将对观察者发送订阅后产生的元素,而在订阅前…...

在Ubuntu22.04 系统中安装Docker详细教程
1.更新系统软件包 #确保您的系统软件包是最新的。这有助于避免安装过程中可能遇到的问题 sudo apt update sudo apt upgrade -y2.安装必要的依赖 sudo apt install apt-transport-https ca-certificates curl software-properties-common -y3.替换软件源 echo "deb htt…...
解决transformers.adapters import AdapterConfig 报错的问题
需要安装 Adapter-Hub 的 transformers 分支,不是官方 transformers 库! pip install githttps://github.com/Adapter-Hub/transformers.git✅ 注意:这个命令会从 GitHub 下载源码并安装。你需要确保你的网络可以访问 GitHub,并且…...

AUTOSAR实战教程--DoIP_01_配置项解释
配置项 解释 备注 DoIPChannelSARef 引用DoIP Tester的源地址,就是你在DoIP Tester这个Containter中配置的Tester实例。 DoIPChannelTARef 引用目标地址。就是你在DoIPTargetAddress这个Container中的配置。 DoIPPduRRxPduId 为该pdu设置一个ID用于DoIP…...
湖北理元理律师事务所:法律视角下的债务优化与生活平衡之道
一、债务优化的本质:法律与生活的平衡艺术 债务问题常被视为单纯的财务危机,实则牵涉法律权责界定、还款能力评估、生活保障等多重维度。作为法律服务机构,我们观察到:真正的债务优化需同时满足两个条件: 法律合规性…...

机器人/智能车纯视觉巡线经典策略—滑动窗口+直方图法
作者:SkyXZ CSDN:SkyXZ~-CSDN博客 博客园:SkyXZ - 博客园 在机器人或智能车的自主导航任务中,视觉巡线是一项最为基础且关键的能力之一。通过摄像头实时获取道路图像,并基于图像信息判断行驶路径࿰…...
附加模块--Qt OpenGL模块功能及架构
一、模块功能: 主要变化 Qt OpenGL 模块的分离: 在 Qt 6 中,原来的 Qt OpenGL 功能被拆分为多个模块 传统的 Qt OpenGL 模块 (QGL*) 已被标记为废弃 新的图形架构: Qt 6 引入了基于 QRhi (Qt Rendering Hardware Interface) 的…...

503 Service Unavailable:服务器暂时无法处理请求,可能是超载或维护中如何处理?
处理 "503 Service Unavailable" 错误是服务器管理者面临的常见挑战之一。这种错误通常表示服务器暂时无法处理请求,可能是由于服务器超载、维护中或其他临时性问题导致的。在本文中,我将介绍如何处理 "503 Service Unavailable" 错…...
抖音怎么下载没有水印的视频?
你是不是经常在抖音上刷到喜欢的视频,想保存下来却总是带着烦人的水印?无论是想收藏精彩片段,还是二次创作,水印都成了“拦路虎”。别急!今天就来教你3种超简单方法,轻松下载无水印抖音视频,高清…...

虚拟机时间同步
一、常见同步方式 常见的虚拟机同步方式有给虚拟机配置ntp、或者用平台提供的agent对时与虚拟机所在的宿主机。第一种依赖网络、第二种依赖平台的agent这个三方工具。 二、利用ptp_kvm.ko来直接和宿主机同步时间 关键组件 ptp_kvm驱动、chrony。 PTP_KVM同步原理 |--------…...
三级流水线是什么?
三级流水线是什么? “三级流水线” 英文名:Three-Stage Pipeline 或 Basic 3-Stage Pipeline,是计算机处理器(CPU)设计中一种基本的指令流水线技术,它将指令的执行过程划分为三个主要阶段,使得…...

软件更新机制的测试要点与稳定性提升
💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…...
自定义protoc-gen-go生成Go结构体,统一字段命名与JSON标签风格
背景 在日常的 Go 微服务开发中,Protocol Buffers(protobuf) 是广泛使用的数据交换格式。其配套工具 protoc-gen-go 会根据 .proto 文件生成 Go 结构体代码,但默认生成的字段名、JSON tag 命名风格往往不能满足所有团队或项目的代…...
Context API 应用与局限性
核心概念 React 的 Context API 是为了解决组件间数据共享而设计的一种机制,其核心价值在于提供了一种不通过 props 层层传递就能在组件树中共享数据的方法。在 React 应用中,数据通常是自上而下(从父组件到子组件)通过 props 传…...

LLMs 系列科普文(11)
目前我们已经介绍了大语言模型训练的两个主要阶段。第一阶段被称为预训练阶段,主要是基于互联网文档进行训练。当你用互联网文档训练一个语言模型时,得到的就是所谓的 base 模型,它本质上就是一个互联网文档模拟器,我们发现这是个…...
DQN算法(详细注释版)
DQN算法 DQN算法使用的常见问题 Q1: 为什么用目标网络而非Q网络直接计算? 答案:避免“移动目标”问题(训练中Q网络频繁变化导致目标不稳定),提高收敛性。 Q2: 为什么用 max 而不是像SARSA那样采样动作?…...
sizeof 与strlen的区别
sizeof 和 strlen 是C和C 中用于处理数据大小和字符串长度的两个不同的操作符/函数,它们的区别如下: 概念和用途 - sizeof 是一个操作符,用于计算数据类型或变量在内存中所占的字节数,它是在编译时确定的,与数据的…...
论文阅读:HySCDG生成式数据处理流程
论文地址: The Change You Want To Detect: Semantic Change Detection In Earth Observation With Hybrid Data Generation Abstract 摘要内容介绍 📌 问题背景 “Bi-temporal change detection at scale based on Very High Resolution (VHR) images is crucia…...

10万QPS高并发请求,如何防止重复下单
1. 前端拦截 首先因为是10万QPS的高并发请求,我们要保护好系统,那就是尽可能减少用户无效请求。 1.1 按钮置灰 很多用户抢票、抢购、抢红包等时候,为了提高抢中的概率,都是疯狂点击按钮。会触发多次请求,导致重复下…...

Xilinx IP 解析之 Block Memory Generator v8.4 ——02-如何配置 IP(仅 Native 接口)
相关文章: Xilinx IP 解析之 Block Memory Generator v8.4 ——01-手册重点解读(仅Native RAM) – 徐晓康的博客 Xilinx IP 解析之 Block Memory Generator v8.4 ——02-如何配置 IP(仅 Native RAM) – 徐晓康的博客 V…...

什么是高考?高考的意义是啥?
能见到这个文章的群体,应该都经历过高考,突然想起“什么是高考?意义何在?” 一、高考的定义与核心功能 **高考(普通高等学校招生全国统一考试)**是中国教育体系的核心选拔性考试,旨在为高校选拔…...
RISC-V 开发板 + Ubuntu 23.04 部署 open_vins 过程
RISC-V 开发板 Ubuntu 23.04 部署 open_vins 过程 1. 背景介绍2. 问题描述3. 解决过程3.1 卸载旧版本3.2 安装 Suitesparse v5.8.03.3 安装 Ceres Solver v2.0.03.4 解决编译爆内存问题 同步发布在个人笔记RISC-V 开发板 Ubuntu 23.04 部署 open_vins 过程 1. 背景介绍 最近…...
量子计算突破:新型超导芯片重构计算范式
2024年IBM 1281量子比特超导芯片实现0.001%量子错误率,计算速度达经典超算2.5亿倍。本文解析: 物理突破:钽基超导材料使量子相干时间突破800μs(提升15倍)架构革命:十字形…...

Spring Cloud 多机部署与负载均衡实战详解
🧱 一、引言 为什么需要多机部署? 解决单节点性能瓶颈,提升系统可用性和吞吐量 在传统单机部署模式下,系统的所有服务或应用都运行在单一服务器上。这种模式在小型项目或低并发场景中可能足够,但随着业务规模扩大、用…...