深入了解Maven(一)

目录

一.Maven介绍与功能

二.依赖管理

1.依赖的配置

2.依赖的传递性

3.排除依赖

4.依赖的作用范围

5.依赖的生命周期


一.Maven介绍与功能

maven是一个项目管理和构建工具,是基于对象模型POM实现。

Maven的作用:

  • 便捷的依赖管理:使用Maven可以简化依赖管理过程。通过在项目的pom.xml文件中声明依赖关系,Maven可以自动下载所需的依赖库,并将它们添加到项目的类路径中。这消除了手动下载和配置jar包的繁琐过程,使依赖管理更加方便和可靠。

  • 统一的项目结构:Maven定义了标准的项目结构,规定了源代码、资源文件、测试代码等目录的布局方式。这使得不同IDE(如Eclipse、IntelliJ IDEA)之间可以共享和识别相同的项目结构,简化了项目之间的迁移和协作。

  • 标准的项目构建流程:Maven提供了一套标准化的项目构建流程。通过执行Maven命令,可以进行项目的编译、测试、打包、部署等一系列操作。这种标准化的构建流程确保了项目的一致性和可重复性,提高了开发效率。


二.依赖管理

1.依赖的配置

所谓的依赖指的就是当前项目所需要的jar包,一个项目可以引入多个jar包

案例:导入多个包 mysql、ch.qos.logback两个包

首先打开maven项目工程找到pom.xml

设置依赖标签

<!--    设置标签依赖--><dependencies>
<!--        设置具体依赖--><dependency>
<!--            配置代表项目或组织的唯一标识符--><groupId>ch.qos.logback</groupId>
<!--            配置代表特定项目的唯一标识符--><artifactId>logback-classic</artifactId>
<!--            配置版本号--><version>1.2.3</version></dependency><!--        操作类似--><dependency><groupId>mysql-java</groupId><artifactId>mysql-java</artifactId><version>5.1.21</version></dependency></dependencies>

如果以前没有使用过相关jar包,则会冒红报错,因为在本地仓库没有找到相关的jar包


2.依赖的传递性

如果一个项目projectA依赖了一个A-jar包,而一个A-jar包中又依赖了其他的jar包,那么projectA对应的也就依赖了A-jar包对应的其他jar包

依赖传递有两种:一种是直接依赖,一种是间接依赖

 通过图标形势查看依赖关系

在pom中右键找到图再点击显示依赖项

这样就可以清晰看到项目之间的依赖

当然依赖可能会产生一个特殊情况,A->B->A 循环依赖,项目A依赖了项目B,而项目B依赖了项目A。这种情况也是面试题常问的一个问题

 面试题:Maven中如何解决依赖循环的问题

  1. 重构代码结构:首先,我们可以检查项目结构并尝试重构代码以消除依赖循环。这可能需要重新设计模块之间的关系,将公共功能提取到独立的模块中,或者修改模块的依赖关系,以确保它们形成一个有向无环图(DAG)。

  2. 使用接口或抽象类:如果依赖循环是由于具体类之间的相互依赖引起的,我们可以考虑使用接口或抽象类来解耦它们。这样,依赖关系将变得单向,并且可以更容易地管理。

  3. 使用Maven插件:Maven提供了一些插件来帮助解决依赖循环问题。例如,可以使用Maven的maven-dependency-plugin来分析项目依赖关系,并找出导致循环的依赖。然后,我们可以使用excludeoptional标记,将其中一个模块的依赖排除或设置为可选,以打破循环。

  4. 模块拆分:另一种方法是将存在依赖循环的模块拆分为更小的、相互独立的模块。这样,我们可以将它们放在不同的项目中,并使用Maven的多模块项目进行管理。通过将功能划分到不同的模块中,可以更好地管理和控制它们之间的依赖关系。


3.排除依赖

由上面的内容可以知道依赖具有传递性,PorjectA项目会依赖A-jar包下的所有依赖jar包。但是如果明确知道工程ProjectA中只需要A-jar包,不需要A-jar包下的某一个包,则可以通过<exclustions>标签和<exclustion>实现排除依赖

 <exclusions><exclusion><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId></exclusion></exclusions>

 可以看到用了排除依赖后相关jar包就不存在了


4.依赖的作用范围

依赖的jar包,在默认情况下,可以在任何地方使用,或者也可以通过<scope></ scope>标签来设置相应jar包的作用范围

作用范围:

  • 主程序范围有效(main文件夹内)
  • 测试程序范围有效(test文件夹范围内)
  • 是否参与打包运行(package指令范围内)

 scope标签值与对应的作用范围

案例:

设置logback的jar包的范围为test,实现只能在test测试程序中运行

 注意不要忘了点击更新

 接下来测试是否更改了作用范围:

1.在test中使用logback的jar包对象,可以看到有提示相应的jar包

2.在main中使用则会发现并没有相应的jar包


5.依赖的生命周期

在Maven中有三套相互独立的生命周期

  • clean 负责清理上一次编译产生的字节码文件
  • default 核心工作 负责编译、测试、打包、安装、部署等等
  • site 生成报告、发布站点等

每一套生命周期都有许多的生命周期阶段,但是我们需要用到的生命周期并不需要太多,只需要掌握以下几个核心生命周期的阶段即可

 核心的生命周期阶段

  • clean 移除上一次构建生成的文件
  • compile编译项目的源代码
  • test使用合适的单元测试框架运行测试
  • package将编译后的文件进行打包
  • install安装项目到本地仓库

注意:同一套的生命周期的运行是由循序的,后面的生命周期的运行是需要依赖前面的生命周期的运行。所以如果使用后面的生命周期阶段,就会自动执行前面的生命周期

比如运行test,会自动运行validate与compile,但是不会运行clean,因为clean与这些不是同一套的生命周期

运行指定的生命周期

有两种方式运行指定的生命周期

第一种,找到右侧栏中的maven打开项目下的生命周期,找到对应周期双击运行即可

第二种,在idea或者cmd中输入指令 mvn xxx即可执行对应的生命周期阶段

周期跳过

在工程文件中找到生命周期,找到小闪电图标,点击即可跳过对应的生命周期。


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

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

相关文章

【java安全】Log4j反序列化漏洞

文章目录 【java安全】Log4j反序列化漏洞关于Apache Log4j漏洞成因CVE-2017-5645漏洞版本复现环境漏洞复现漏洞分析 CVE-2019-17571漏洞版本漏洞复现漏洞分析 参考 【java安全】Log4j反序列化漏洞 关于Apache Log4j Log4j是Apache的开源项目&#xff0c;可以实现对System.out…

前端性能优化——包体积压缩插件,打包速度提升插件,提升浏览器响应的速率模式

前端代码优化 –其他的优化可以具体在网上搜索 压缩项目打包后的体积大小、提升打包速度&#xff0c;是前端性能优化中非常重要的环节&#xff0c;结合工作中的实践总结&#xff0c;梳理出一些 常规且有效 的性能优化建议 ue 项目可以通过添加–report命令&#xff1a; "…

innodb索引与算法

B树主键插入 B树在innodb的插入有三种模式page_last_insert, page_dirction, page_N_direction 而在bustub里面的B树就是page_N_direction,如果是自增主键的话&#xff0c;就是上面这样的插入法 FIC优化 (DDL) 选择性统计 覆盖索引 MMR ICP优化 自适应hash 全文索引 MySQL…

List和ObservableCollection和ListBinding在MVVM模式下的对比

List和ObservableCollection和ListBinding在MVVM模式下的对比 List 当对List进行增删操作后&#xff0c;并不会对View进行通知。 //Employee public class Employee : INotifyPropertyChanged {public event PropertyChangedEventHandler? PropertyChanged;public string N…

Vue-13.创建完整的Vue项目(vue+vue-cli+js)

前言 之前写了命令创建Vue项目&#xff0c;但是事实上我们可以直接用编译器直接创建项目&#xff0c;这里我使用webstorm&#xff08;因为我是前后端兼修的所以我习惯使用Idea家族的编译器&#xff09; 只写前端的推荐用VsCode前后端都写的推荐用webstorm 新建项目 项目初始…

vscode 安装勾选项解释

1、通过code 打开“操作添加到windows资源管理器文件上下文菜单 &#xff1a;把这个两个勾选上&#xff0c;可以对文件使用鼠标右键&#xff0c;选择VSCode 打开。 2、将code注册为受支持的文件类型的编辑器&#xff1a;不建议勾选&#xff0c;这样会默认使用VSCode打开支持的相…

《Linux从练气到飞升》No.15 Linux 环境变量

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的…

SASS 学习笔记 II

SASS 学习笔记 II 上篇笔记&#xff0c;SASS 学习笔记 中包含&#xff1a; 配置 变量 嵌套 这里加一个扩展&#xff0c;嵌套中有一个 & 的用法&#xff0c;使用 & 可以指代当前 block 中的 selector&#xff0c;后面可以追加其他的选择器。如当前的 scope 是 form&a…

GuLi商城-前端基础Vue-使用Vue脚手架进行模块化开发

自己亲自实践&#xff1a; mac安装webpack webpack 简介Webpack 是一个非常流行的前端构建工具&#xff0c;它可以将多个模块&#xff08;包括CSS、JavaScript、图片等&#xff09;打包成一个或多个静态资源文件&#xff08;bundle&#xff09;&#xff0c;以便用于部署到生产…

【Axure高保真原型】JS日期选择器筛选中继器表格

今天和大家分享JS日期选择器筛选中继器表格的原型模板&#xff0c;通过调用浏览器的日期选择器&#xff0c;所以可以获取真实的日历效果&#xff0c;具体包括哪一年二月份有29天&#xff0c;几号对应星期几&#xff0c;都是真实的&#xff0c;获取日期值后&#xff0c;通过交互…

接口测试,负载测试,并发测试,压力测试区别

接口测试 1.定义&#xff1a;接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 2.目的&#xf…

什么是变量提升(hoisting)?它在JavaScript中是如何工作的?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 变量提升&#xff08;Hoisting&#xff09;⭐ 变量提升的示例&#xff1a;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&…

C++11并发与多线程笔记(9) async、future、packaged_task、promise

C11并发与多线程笔记&#xff08;9&#xff09; async、future、packaged_task、promise 1、std::async、std::future创建后台任务并返回值2、std::packaged_task&#xff1a;打包任务&#xff0c;把任务包装起来3、std::promise3、小结 1、std::async、std::future创建后台任务…

哈工大开源“活字”对话大模型

一、介绍 大规模语言模型&#xff08;LLM&#xff09;在自然语言处理的通用领域已取得了令人瞩目的成功。对于广泛的应用场景&#xff0c;这种技术展示了强大的潜力&#xff0c;学术界和工业界的兴趣也持续升温。哈工大自然语言处理研究所30余位老师和学生参与开发了通用对话大…

re学习(35)攻防世界-no-strings-attached(动调)

参考文章&#xff1a;re学习笔记&#xff08;28&#xff09;攻防世界-re-no-strings-attached_Forgo7ten的博客-CSDN博客 攻防世界逆向入门题之no-strings-attached_攻防世界 no-strings-attached_沐一 林的博客-CSDN博客 本人题解&#xff1a; 扔入Exepeinfo中查壳和其他信息…

LVS-DR模型实例

一、LVS-DR集群介绍 LVS-DR&#xff08;Linux Virtual Server Director Server&#xff09;工作模式&#xff0c;是生产环境中最常用的一 种工作模式。 1、LVS-DR 工作原理 LVS-DR 模式&#xff0c;Director Server 作为群集的访问入口&#xff0c;不作为网关使用&#xff0…

python+django+mysql项目实践五(信息搜索)

python项目实践 环境说明: Pycharm 开发环境 Django 前端 MySQL 数据库 Navicat 数据库管理 信息搜素 输入内容进行搜索,内容有文本类和时间类 文本类需要模糊搜索,包含即检索 时间类需要选取时间范围内的内容 views 利用Q完成对指定内容的检索 检索后按检索内容更新…

HarmonyOS/OpenHarmony应用开发-ArkTS语言渲染控制ForEach循环渲染

ForEach基于数组类型数据执行循环渲染。说明&#xff0c;从API version 9开始&#xff0c;该接口支持在ArkTS卡片中使用。 一、接口描述 ForEach(arr: any[], itemGenerator: (item: any, index?: number) > void,keyGenerator?: (item: any, index?: number) > stri…

网络综合布线实训室建设方案

一、网络综合布线系统概述 网络综合布线系统是为了满足数据通信需求而设计和建立的一套基础设施。它提供了数据传输、信号传输和电力供应的基础结构&#xff0c;支持各种网络设备和终端设备之间的连接。 网络综合布线系统通常包括以下组成部分&#xff1a; 1&#xff09; 数据…

ZooKeeper集群服务器启动

在本文中&#xff0c;我们将对集群版ZooKeeper服务器的启动过程做详细讲解。集群和单机ZooKeeper服务器的启动过程在很多地方都是一致的&#xff0c;因此本节只会对有差异的地方展开进行讲解。下图所示是集群版ZooKeeper服务器的启动流程图。 预启动 预启动的步骤如下。 (1)统…