Maven-依赖管理

news2024/11/24 13:41:08

一. 依赖管理

1. maven-依赖管理-依赖配置

  • 依赖:指当前项目运行所需要的jar一个项目中可以引入多个依赖
  • 例如:在当前工程中,我们需要用到logback来记录日志,此时就可以maven工程的pom.xml文件中,引入logback的依赖。具体步骤如下:
  1.  在pom.xml中编写<dependencies>标签
  2.  在<dependencies>标签中使用<dependency> 引入坐标
  3.  定义坐标的 groupId、artifactId、version
  4.  点击刷新按钮,引入最新加入的坐标

 

</properties>

    <!-- 依赖配置 -->
    <dependencies>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>
    </dependencies>

</project>
注意事项:
1. 如果引入的依赖,在本地仓库中不存在,将会连接远程仓库 / 中央仓库,然后下载依赖
  (这个过程会比较耗时,耐心等待)
2. 如果不知道依赖的坐标信息,可以到 mvn 的中央仓库( https://mvnrepository.com/ )中      搜索

 添加依赖的几种方式:

1. 利用中央仓库搜索的依赖坐标

 2. 利用IDEA工具搜索依赖

 3. 熟练上手maven后,快速导入依赖

 2. maven-依赖管理-依赖传递

2.1 依赖具有传递性
  • 早期我们没有使用maven时,向项目中添加依赖的jar包,需要把所有的jar包都复制到项目工程下。如下图所示,需要logback-classic时,由于logback-classic又依赖了logback-coreslf4j所以必须把这3jar包全部复制到项目工程下:
我们现在使用了 maven ,当项目中需要使用 logback-classic 时,只需要在 pom.xml 配置文件中,添
logback-classic 的依赖坐标即可。
  • 在pom.xml文件中只添加了logback-classic依赖,但由于maven的依赖具有传递性,所以会自动把所依赖的其他jar包也一起导入。

依赖传递可以分为:

1. 直接依赖:在当前项目中通过依赖配置建立的依赖关系
2. 间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源

 比如以上图中:

  • projectA依赖了projectB。对于projectA 来说,projectB 就是直接依赖。
  • projectB依赖了projectC及其他jar包。 那么此时,在projectA中也会将projectC的依赖传递下来。对于projectA 来说,projectC就是间接依赖。

2.2. 排除依赖

问题:之前我们讲了依赖具有传递性。那么 A 依赖 B B 依赖 C ,如果 A 不想将 C 依赖进来,是否可               以做到?
答案:在 maven 项目中,我们可以通过排除依赖来实现。
什么是排除依赖?
  • 排除依赖:指主动断开依赖的资源。(被排除的资源无需指定版本)

依赖排除示例:

  • maven-projectA依赖了maven-projectBmaven-projectB依赖了Junit。基于依赖的传递性,所以maven-projectA也依赖了Junit

 使用排除依赖后:

 <dependency>
            <groupId>com.itheima</groupId>
            <artifactId>maven-projectB</artifactId>
            <version>1.0-SNAPSHOT</version>
            
            <!--  排除依赖,主动断开依赖的资源 -->
            <exclusions>
                <exclusion>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                </exclusion>
            </exclusions>
            
        </dependency>

3. maven依赖管理-依赖范围

什么是依赖范围以及依赖范围的配置方式

  • 我们在pom.xml配置文件当中所配置的依赖,默认情况下是可以在任何地方使用的
  • 在项目中导入依赖的jar包后,默认情况下,可以在任何地方使用。

  • 这里所说的任何地方指的是这个jar包可以在main这个文件夹下使用,也就是主程序范围内有效;也可以在test这个文件夹下使用,也就是测试程序范围内有效;也可以在这个项目打包的时候,将这个jar包包含进去,也就是这个依赖会参与这个项目的打包运行,那这是默认情况。
  • 如果希望限制依赖的使用范围,可以通过标签设置其作用范围。
  • 而在Maven当中,我们是可以通过一个标签叫做scope来控制这个依赖的作用范围。

 作用范围:

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

  • scope配置为默认值compile的时候,它在任何范围内都是有效的,主程序范围内有效,测试程序范围内有效,也会参与打包。
  • 我们在进行项目开发时,绝大部分依赖scope的取值都是默认值compile,那如果取的是默认值scope就不用配置了。
  • scope标签的第二个取值test,test代表的是这个依赖仅仅在测试程序范围内有效,在主程序当中不能使用,也不会参与项目的打包,那这个比较典型的就是junit单元测试,它仅仅在测试范围内有效。
  • scope标签的第三个取值provided,provided代表的是在主程序以及测试程序范围内都有效,但是它不参与项目的打包,那这个比较典型的就是我们后面要提到的一个技术servlet。
  • scope标签的第四个取值runtime,runtime代表的是这个依赖,它在主程序当中不能使用,在测试程序当中可以使用,也可以参与项目的打包运行,那这个比较典型的就是后面我们讲解数据库这一块要讲到的jdbc的驱动,通过Java来操作数据库的一个jar包。

在程序当中我们要来验证这个依赖有没有生效,我们主要去看一下,能不能使用里面的接口或者是类就可以了。

那在logback当中,给我们提供了一个接口叫做Logger。

  •   如上图所示,给junit依赖通过scope标签指定依赖的作用范围。 那么这个依赖就只能作用在  测 试环境,其他环境下不能使用。

我们可以额外配置一个插件,是一个打包插件,那默认Maven呢它也给我们提供了打包的功能,但是它所提供的这个打包的插件,只能够将当前项目的资源打进去,它所依赖的这些jar包,它是并不会打进去的。在Java中,当前项目的资源指的是当前项目中正在使用的资源,包括类、方法、变量、资源文件等。

4. maven依赖管理-生命周期

4.1 介绍

  • Maven的生命周期就是为了对所有的maven项目构建过程进行抽象和统一,就是来描述一次项目构建要经历哪些阶段。

  • Maven 出现之前,项目构建的生命周期就已经存在,软件开发人员每天都在对项目进行清理,编译, 测试及部署。虽然大家都在不停地做构建工作,但公司和公司间、项目和项目间,往往使用不同的方式做类似的工作。
  • Maven 从大量项目和构建工具中学习和反思,然后总结了一套高度完美的,易扩展的项目构建生命周期。这个生命周期包含了项目的清理,初始化,编译,测试,打包,集成测试,验证,部署和站点生成等几乎所有构建步骤。
Maven对项目构建的生命周期划分为3套(相互独立):
  • clean负责清理工作。主要就是来清理上一次项目构建所产生的一些文件,比如编译之后的              class字节码文件,打包之后的jar包文件。
  • default负责整个项目构建的核心工作。如:编译、测试、打包、安装、部署等。
  • site生成报告、发布站点等(很少会用到)

这三套相互独立的生命周期,每一个生命周期又分为若干个阶段,而这些阶段,是生命周期当中最细化的操作。

每套生命周期包含一些阶段(phase),在同一套生命周期当中,阶段是有先后顺序的,先运行前面的阶段,再运行后面的阶段,而后面的阶段依赖于前面的阶段的,那也就是说在同一套生命周期当中,我们运行后面的阶段进行项目的构建,前面的阶段它也会运行。

三套生命周期又包含哪些具体的阶段呢 , 我们来看下面这幅图 :

 

我们看到这三套生命周期,里面有很多很多的阶段,这么多生命周期阶段,其实我们常用的并不多,我们使用Maven进行项目构建,其实主要关注其中的五个阶段即可:
  • clean:移除上一次构建生成的文件
  • compile:编译项目源代码,将项目的源代码编译成class字节码文件
  • test:使用合适的单元测试框架运行测试(junit)
  • package:将编译后的文件打包,打成jar包或者是war包,如:jarwar
  • install:指的是将打包好的jar包或者是war包安装到Maven的本地仓库

二次提醒:在同一套生命周期中,当运行后面的阶段时,前面的阶段也会运行。

Maven的生命周期以及生命周期的各个阶段都是抽象的概念,这意味着生命周期它本身并不执行任何具体的操作在Maven的设计中,它的具体操作 / 实际任务(如源代码编译)是由与其绑定的Maven插件来完成的,因为Maven本质就是一个插件执行框架,所有的工作都是由插件完成的。

 IDEA工具为了方便程序员使用maven生命周期,在右侧的maven工具栏中,已给出快速访问通道

在Maven面板当中,最上面的这一块展示的就是生命周期,Plugins展示的是于生命周期各个阶段绑定的插件,当我们双击上面的生命周期的各个阶段在运行的时候,其实最终是由这些插件来完成对应的工作的。

 

  •  生命周期的顺序是:clean --> validate --> compile --> test --> package --> verify --> install --   > site  --> deploy
我们需要关注的就是: clean --> compile --> test --> package --> install

 4.2 执行

在日常开发中,当我们要执行指定的生命周期时,有两种执行方式:

  1.  idea工具右侧的maven工具栏中,选择对应的生命周期,双击执行
  2.  DOS命令行中,通过maven命令执行
方式一:在 idea 中执行生命周期
  • 选择对应的生命周期,双击执行

 compile

 test

package

 install

clean

 方式二:在命令行中执行生命周期

1. 进入到DOS命令行

 

 

 

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

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

相关文章

Python让ChatGPT全自动改写生成文章教程

ChatGPT是一个在自然语言处理领域非常先进的文本生成模型&#xff0c;它能够产生高质量、连贯的文章。它受到了广泛的关注&#xff0c;因为它可以自动生成大量的文本&#xff0c;从而减轻了人工写作的负担。怎么使用chatgpt批量改写文章&#xff1f;最简单的方式就是找到一家接…

I.MX6U开发板使用OTG烧写系统

1.系统烧写 在实际的产品开发中肯定不可能通过网络来运行&#xff0c;否则没网的时候产品岂不 是就歇菜了。因此我们需要将 uboot、linux kernel、.dtb(设备树)和 rootfs 这四个文件烧写到板子 上的 EMMC、NAND 或 QSPI Flash 等其他存储设备上&#xff0c;这样不管有没有网络我…

SpringCloud 使用sentinel

一、添加依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> 二、配置文件配置地址 spring:cloud:sentinel:transport:dashboard: localhost:8080三…

机器学习:基于逻辑回归对优惠券使用情况预测分析

机器学习&#xff1a;基于逻辑回归对优惠券使用情况预测分析 作者&#xff1a;i阿极 作者简介&#xff1a;Python领域新星作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x…

Elasticsearch:集群管理的一些建议

在之前的文章 “Elasticsearch&#xff1a;集群管理” &#xff0c;我们对集群管理做了一些介绍。在今天的文章中&#xff0c;我们接着来聊一下有关配置的方面的问题。这在很大程度上取决于你的用例&#xff0c;是索引还是搜索繁重。 我们将在这里讨论在集群设置方面我们需要关…

中国算力的想象力有多大?|产业特稿

巨头入场和“东数西算”的助推&#xff0c;让中国离这个万亿级算力蓝海更近了一步。 作者|思杭 编辑|皮爷 出品|产业家 2023年初&#xff0c;在青岛、济南、日照等12座城市&#xff0c;一座座崭新的大型数据中心拔地而起。 其中&#xff0c;最引人瞩目的属2月23日&#xff…

文件上传漏洞 --- php邂逅windows通用上传缺陷

目录 后端源码 前端源码 后端代码审计 方式一绕过原理 --- 冒号加特性 验证及结果 方式二绕过原理 --- 数据流 验证及结果 环境需求 php5.2.17IIS环境&#xff0c;可以下载phpstuday2018来满足环境的要求。 后端源码 <?php //U-Mail demo ... if(isset($_POST[sub…

【AI能否取代设计师】「Stable Diffusion」AI绘画黑科技将告诉你答案

上一篇文章&#xff1a;【AI绘画】我以Midjourney为主学习AI绘画效果咋样&#xff1f;_山楂山楂丸的博客-CSDN博客 目录 前言 一、「Stable Diffusion」 是什么 二、「Stable Diffusion」上手演练 三、竟然还有ChatGPT&#xff1f; 四、「Stable Diffusion」作品展示 五、…

爆火的Auto-GPT:实战及运行体验

Auto-GPT可以说是目前AI应用方向最火爆的项目了&#xff0c;自从3月份上线以来&#xff0c;一个月疯狂拦下将近7万star&#xff08;截至本文写稿时69.5k&#xff09;。它的目的是探索诸如GPT-4这样的大语言模型自主完成任务的能力。业界也有一些大佬出来表示这个项目真的很有趣…

pnpm与monorepo架构

本文根据b站up小满zs教程记录 软硬连接介绍 在cmd环境下输入mklink 创建链接需要开启管理员模式 软连接 # mklink 要创建的连接名称 源文件 mklink ruan.js ying.js硬链接 共享一个内存地址。 # mklink 要创建的连接名称 源文件 mklink /H ying.js ying.jspn…

工程项目管理系统源码-简洁+好用+全面-工程项目管理

​工程项目管理系统是指从事工程项目管理的企业&#xff08;以下简称工程项目管理企业&#xff09;受业主委托&#xff0c;按照合同约定&#xff0c;代表业主对工程项目的组织实施进行全过程或若干阶段的管理和服务。 ​系统定义 工程项目管理企业不直接与该工程项目的总承包企…

STL : 单向链表 Forward_list 与 双向链表 List

目录 Forward_list Member functions List Elements access Modifiers Operations Observes Forward_list #include using namespace std; 单链表&#xff1a;数据的存储位置是分散的、随机的&#xff0c;整个链表的数据的线性关系通过指针来维持&#xff1b; 擅长…

【LeetCode 训练营 3,5】无重复字符的最长子串+最长回文子串

&#x1f48c; 博客内容&#xff1a;LeetCode 训练营 &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准前端&#xff0c;专注基础和实战分享 &#xff0c;欢迎私信&#xff01; &#x1f496; 欢迎大家&#xff1a;这…

架构重构的技巧

1 代码重构 定义 对软件代码做任何改动以增加可读性或者简化结构而不影响输出结果。 目的 增加可读性、增加可维护性、可扩展性 3 关键点 不影响输出不修正错误不增加新的功能性 代码重构时&#xff0c;发现有个功能实现逻辑不合理&#xff0c;可直接修改吗&#xff1f;…

网络安全-JDBC反序列化漏洞与RCE

目录环境Black Hat Europe 2019漏洞原理攻击手法mysql-connector-java的分析Mysql协议抓包分析Mysql服务器docker启动抓包&&分析Fake Mysql Server搭建Java反序列化工具ysoserial使用fnmsd师傅的MySQL_Fake_Server使用Y4tacker师傅的脚本JDBC代码项目架构代码复现参考环…

Python爬虫之读取数据库中的数据

之前几篇我们一直在研究如何从网站上快速、方便的获取数据&#xff0c;并将获取到的数据存储在数据库中。但是将数据存储在数据中并不是我们的目的&#xff0c;获取和存储数据的目的是为了更好的利用这些数据&#xff0c;利用这些数据的前提首先需要从数据库按一定的格式来读取…

LeetCode——二叉树的非递归遍历

144. 二叉树的前序遍历 给你二叉树的根节点root&#xff0c;返回它节点值的前序遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 示例 3&#xff1a; 输入&#xff1…

[ 应急响应基础篇 ] 使用 Autoruns 启动项分析工具分析启动项(附Autoruns安装教程)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

Spring详解简介

1、Spring的简介 Spring的英文翻译为春天&#xff0c;可以说是给Java程序员带来了春天&#xff0c;因为它极大的简化了开发。我得出一个公式&#xff1a;Spring 春天 Java程序员的春天 简化开发。最后的简化开发正是Spring框架带来的最大好处。 Spring是一个开放源代码的设计…

SpringSecurity之两个重要接口

前言 前面讲解了关于SpringSecurity的基本原理&#xff0c;其中介绍了过滤器链以及过滤器加载的过程。我们在前面入门案例中的用户名和密码是系统自动生成的&#xff0c;在真实应用环境中&#xff0c;是需要查询数据库获取用户名密码是否匹配的&#xff0c;那么如何实现呢&…