Maven深入了解

Maven深入了解

  • 前言
  • 一、Maven的核心概念
    • 1.1 Maven-Jar包+模块化管理
    • 1.2 POM
    • 1.3 坐标及其命名规范
    • 1.4 仓库的概念
    • 1.5 生命周期
    • 1.6 插件和目标
  • 二、依赖管理
    • 2.1 自己写的模块和模块之间也可以互相依赖
    • 2.2 依赖的生效范围(scope标签)
    • 2.3 依赖的传递性
    • 2.4 依赖冲突问题
    • 2.5 依赖的排除
    • 2.6 依赖版本统一管理
  • 三、继承
    • 3.1 手动更改配置文件
    • 3.2 使用IDEA自动继承
  • 四、聚合
    • 4.1 问题引入
    • 4.2 解决方案

前言

上一章的学习已经足够掌握对Maven的基本使用了
而本章节对Maven的深入了解即使不掌握也不影响Maven的使用
不过经过本章更细节的学习
在往后使用Maven出现的小问题 可以更快速的定位问题所在

一、Maven的核心概念

1.1 Maven-Jar包+模块化管理

Maven的两大主要功能就是:

  1. 管理Jar包
  2. 模块化管理项目

1.2 POM

本质就是面向对象/模块化的思想
Maven主要就两个点:
第一是对jar包的各种管理
第二是对项目的管理(把项目拆分成各个模块项目进行管理)
在这里插入图片描述

1.3 坐标及其命名规范

  • 数学中,在平面上xy能确定一个唯一的点;在空间上xyz能确定一个唯一的点
  • 类似的,在Maven中的坐标也是这个作用,确定该项目/模块的唯一路径

这里用install自己的模块到本地仓库为例:
在这里插入图片描述
在这里插入图片描述

  • 命名规范:
    groupId:公司或者组织的域名的倒序+当前项目/模块名称
    artifactId:当前项目/模块的名称
    version:当前项目/模块的版本号

1.4 仓库的概念

事实上 在实际工作中 本地仓库和中央仓库之间还存在一个私服
也就是公司为了方便统一管理 自己搞得私人服务器
由公司统一从中央仓库下载 员工在个人电脑上配置公司私服的地址
这样做主要就是为了公司能统一管理
在这里插入图片描述

1.5 生命周期

clean default site
在这里插入图片描述

1.6 插件和目标

刚刚说Maven生命周期 那么多的功能 实际上都是有插件完成的
而Maven的核心仅仅是定义了生命周期
在这里插入图片描述

目标可以理解成任务
任务和插件的关系是一对多
在这里插入图片描述

二、依赖管理

2.1 自己写的模块和模块之间也可以互相依赖

在这里插入图片描述

因为我之前已经对Test02进行过install操作
所以直接测试 是没什么问题的
在这里插入图片描述

看看我把Test02在本地仓库的Jar删除会发生什么
在这里插入图片描述

2.2 依赖的生效范围(scope标签)

  • compile默认就是这个范围)
    1.main目录下的Java代码可以访问这个范围的依赖
    2.test目录下的Java代码可以访问这个范围的依赖
    3.部署到Tomcat服务器上运行时 要放在WEB-INF的lib目录下(简单的理解成部署出去的肯定是给用户使用的 用的就是主程序的代码 所以肯定要放)

列如上面的Junit 我没有写任何scope标签 所以是默认的compile
那么我无论是在主程序里importJunit还是在测试程序里importJunit 都不会报错

  • test
    1.main目录下的Java代码不能访问这个范围的依赖
    2.test目录下的Java代码可以访问这个范围的依赖
    3.部署到Tomcat服务器上运行时不会放在WEB-INF的lib目录下(测试程序 我当然不需要部署 这对用户来说是无关紧要的)

  • provided(生效范围和compile一致)
    1.main目录下的Java代码可以访问这个范围的依赖
    2.test目录下的Java代码可以访问这个范围的依赖
    3.部署到Tomcat服务器上运行时不会放在WEB-INF的lib目录下

因为Tomcat也是用Java写的 他所依赖的Jar包肯定是自带的
而我的项目如果用到了相同的Jar包 直接用Tomcat的就行了
例如:servlet-api在服务器上运行时,Servlet容器会提供相关API,所以部署的时候不需要

2.3 依赖的传递性

在这里插入图片描述
在这里插入图片描述

2.4 依赖冲突问题

Maven自动会根据以下两点原则帮助我们处理依赖冲突问题

1.路径最短者优先
在这里插入图片描述

2.路径相同时先声明者优先
注:这里的声明指的是父模块对于依赖子模块的声明
如果在MakeFried里先声明对HelloF的依赖 那就传递2.14
反之传递2.17
在这里插入图片描述

2.5 依赖的排除

比如:
03依赖了02 02依赖了Junit4.5
根据依赖传递原则 Junit4.5会传递给03
但是03不想要4.5 想自己依赖一个4.9
如何解决?
在这里插入图片描述排除之后 我想依赖谁自己添加即可在这里插入图片描述

2.6 依赖版本统一管理

以Spring全家桶为例
当我引入一大堆依赖的时候 肯定希望版本是统一的
同时也不希望在不统一的情况下一个一个去改版本
这个时候就有了之前的约定>配置>编码的思想
那我能不能把版本号提取出来成一个配置 然后直接引用呢?
在这里插入图片描述

牵一发则动全身
在这里插入图片描述

三、继承

3.1 手动更改配置文件

注意:这里容易混淆
在2.6不是提到了统一管理吗
为什么这里又搞出来一个继承?
2.6的统一管理 是针对在同一个Maven项目里需要多个依赖
这里继承是针对多个Maven项目里来统一管理依赖

在这里插入图片描述

其中 父工程他其实没必要打成jar包
因为他的作用就是给子工程去继承使用
方便统一管理的
真正有用的 要打包成jar的 就是子工程

1.首先在父工程声明一下打包方式
在这里插入图片描述
2.然后在每一个子工程的pom文件里实现继承
在这里插入图片描述

3.最后为了统一管理子工程依赖版本号 需要在父工程的pom里设置
在这里插入图片描述
3.记住如果需要使用父类统一的版本 需要在子类直接把依赖的版本坐标删掉就行(否则就类似于子类重写了父类方法 肯定优先使用子类的方法)
在这里插入图片描述
4.上面那种方式父工程里并不会加载所写的依赖 仅仅是统一管理了版本
而这种方式 父类会加载junit 同时子类会直接继承并加载junit 都不需要写dependency
在这里插入图片描述

3.2 使用IDEA自动继承

在这里插入图片描述

四、聚合

4.1 问题引入

聚合的前提是有继承关系
HelloF依赖Hello
我想打包HelloF之前 必须先把Hello install到本地仓库才行
否则会报错
在这里插入图片描述

如果存在大量的依赖
每次都要我一个一个去找去install 岂不是非常低效率?

4.2 解决方案

聚合的配置很简单
在这里插入图片描述

这样一来 问题就解决了
而且MAVEN先后顺序都考虑到了
在这里插入图片描述
别说是package 直接install Parent都可以!!
在这里插入图片描述

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

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

相关文章

Linux——多线程

目录 线程概念 线程控制 线程创建 进程 vs 线程 线程异常 线程等待 线程终止 pthread_cancel 进程替换 线程分离 线程互斥 mutex mutex接口 mutex的理解 互斥锁的实现 可重入和线程安全 死锁 什么是死锁 死锁产生的必要条件 避免死锁 线程同步 概念 条件…

一个悄然崛起的AI开源项目!

众所周知,最近这半年AI相关的话题实在是火到出圈。尤其是生成式AI的流行,让我们普通人也可以近距离地接触和应用AI。这其中最典型的就是ChatGPT。 那除了ChatGPT,还有一个非常实用的领域,也是我们今天要讨论的话题,那…

Day33:安全开发-JavaEE应用SQL预编译Filter过滤器Listener监听器访问控制

目录 JavaEE-预编译-SQL JavaEE-过滤器-Filter JavaEE-监听器-Listen 思维导图 Java知识点 功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方库使用等. 框架库:MyBatis&#…

学习SSM的记录(八)-- SSM整合项目《任务列表案例》

前端程序搭建和运行 项目预览 接口分析 1.学习计划分页查询 需求:查询对应数据页数据 uri:schedule/{pageSize}/{currentPage} 请求方式:get 响应数据:json {"code":200,"flag":true,"data"…

基于springboot实现数据资产管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现数据资产管理系统演示 摘要 固定资产管理系统主要是完成对系统用户管理、资产信息管理、资产变更管理、资产用途管理、资产类别管理和资产增减管理。因为利用本系统管理员可以直接录入信息,修改信息,删除信息,并且若在录入…

JAVA初阶数据结构链表(2)双向链表( +专栏数据结构练习是完整版)

1.双向链表的结构(双向不带头不循环链表) 需要注意的一点就是,在jdk中的链表就是双向链表 一个节点有三个域 val(数值域) next(地址域) prev(前驱记录前一个节点的地址&#xff09…

力扣思路题:重复的子字符串

注意比较j与j-i是否相同 bool repeatedSubstringPattern(char* s) {int i;int nstrlen(s);bool flag;for(int i1;i<n/2;i){if(n%i0){flagtrue;}for(int ji;j<n;j){if(s[j]!s[j-i]){flagfalse;break;}}if(flagtrue){return true;}}return false; }

腾讯云服务器地域有啥区别?选哪个比较好?

腾讯云服务器地域怎么选择&#xff1f;不同地域之间有什么区别&#xff1f;腾讯云哪个地域好&#xff1f;地域选择遵循就近原则&#xff0c;访客距离地域越近网络延迟越低&#xff0c;速度越快。腾讯云百科txybk.com告诉大家关于地域的选择还有很多因素&#xff0c;地域节点选择…

sql server 恢复数据库、恢复单表数据的方法

如果不小心把某个表的数据删了&#xff0c;可以用之前的备份文件对单表进行数据恢复。 1、新建一个数据库&#xff08;全新的数据库&#xff09;&#xff0c;记得路径&#xff0c;恢复的时候要用到&#xff0c;新建完不要对数据库做什么操作。 2、用需要恢复表的数据库的备份文…

基于FPGA的OV7725摄像头的HDMI显示(含源码)

1、概述 本文FPGA通过SCCB接口初始化OV7725摄像头寄存器&#xff0c;然后采集OV7725的摄像头数据&#xff0c;使用DDR3对数据进行暂存&#xff0c;最后将数据输出到HDMI显示器上进行显示。 该工程对应系统框图如下所示&#xff0c;主要包含OV7725驱动及数据处理模块、DDR3读写控…

CSS概念及入门

CSS概念及入门 简介 CSS 的全称为&#xff1a;层叠样式表 ( Cascading Style Sheets ) 。 CSS 也是一种标记语言&#xff0c;用于给 HTML 结构设置样式&#xff0c;例如&#xff1a;文字大小、颜色、元素宽高等等。 主流的布局方式:divcss。 组成 选择器 用于选择页面中的…

防御安全(IPSec实验)

目录 需求&#xff1a; pc1 ping通 pc2 ,使用IPSec VPN 拓扑图&#xff1a; ​编辑实验配置&#xff1a; 注意&#xff1a; 直接在路由器r1和r2分别配置即可&#xff0c;路由器r1和r2要写一条缺省指向ISP 实验配置截图如下&#xff1a; 2. r1​编辑 3. r3​编辑 3.r…

Go——数组

Golang Array和以往认知的数组有很大的。 数组是同一种数据类型的固定长度的序列。数组定义&#xff1a;var a[len] int&#xff0c;比如&#xff1a;var a [5]int&#xff0c;数组长度必须是常量&#xff0c;且类型的组成部分。一旦定义&#xff0c;长度不能变。长度是数组类…

docker镜像ssh服务

基于commit命令实现 首先我们是基于Ubuntu:18.04版本做ssh服务&#xff0c;拉取镜像 [rootmaster ~]# docker pull ubuntu:18.04 [rootmaster ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 18.04 f9a80a5…

vue3 el-form中嵌套el-tabale 对输入动态校验

简单案例 <el-form :model"Form" :rules"rules" ref"FormRef" class"formDiv"><el-table :data"Form.copyWriters" style"width: 100%"><el-table-column label"文案链接"><temp…

rancher是什么

Rancher Labs是制作Rancher的公司。Rancher Labs成立于2014年&#xff0c;是一家专注于企业级容器管理软件的公司。它的产品设计旨在简化在分布式环境中部署和管理容器的过程&#xff0c;帮助企业轻松地采用容器技术和Kubernetes。Rancher Labs提供的Rancher平台支持Docker容器…

H5 简单四按钮个人主页源码

源码名称&#xff1a;简单四按钮个人主页源码 源码介绍&#xff1a;一款简单的带4个按钮选项的个人主页源码&#xff0c;可自行修改内容作为自己的个人主页。 需求环境&#xff1a;H5 下载地址&#xff1a; https://www.changyouzuhao.cn/11458.html

ubuntu 23.04 安装 中文输入法

1、安装 fcitx sudo apt install fcitxfcitx 安装好后&#xff0c;可以使用 fcitx-configtool 命令进行配置&#xff0c;其界面如下所示。在这里可以配置不同输入法的切换快捷键&#xff0c;默认输入法等。刚安装系统后&#xff0c;这里只有一个输入法&#xff0c;所以接下来要…

元宇宙崛起:区块链与金融科技共绘数字新世界

文章目录 一、引言二、元宇宙与区块链的深度融合三、区块链在元宇宙金融中的应用四、金融科技在元宇宙中的创新应用五、面临的挑战与机遇《区块链与金融科技》亮点内容简介获取方式 一、引言 随着科技的飞速发展&#xff0c;元宇宙概念逐渐走进人们的视野&#xff0c;成为数字…

先进电气技术 —— 片上宽禁带器件的集成与应用

一、背景 功率转换器设计的一个关键目标是降低功率损耗以提高转换效率&#xff0c;这对可再生能源等应用产生影响。通过降低功率损耗&#xff0c;可以减小变换器元件的尺寸&#xff0c;从而使整个变换器的尺寸更小。因此&#xff0c;转换器的大小和成本完全取决于设计要求和应…