在一次需求迭代中,我要求同事把写好的 rpc 接口打好包上传到公司私服上,她直接当场懵逼住了。
我突然发现它对于 maven 仅仅是处于最基础的使用阶段,不仅不知道背后的一些原理,甚至连一些常见的概念都不是很清晰,仅仅会使用 maven 构建项目,引入依赖,打包等最基础的操作。于是,在公司搞了一次内部培训,帮助大家补补课,也让她成功的完成了需求。我在这里做一个小总结,希望能够帮助到更多的人。
依赖
依赖是我们在使用 maven 构建项目时最常使用的功能,通过依赖标签,我们可以直接从maven仓库中引入对应的jar包,无需手动再将jar添加到目录下了,可谓是十分方便,不过我们除了使用,还需要考虑多模块下依赖之间的关系。
依赖配置
这个大家应该都很熟悉了,通过标签引入maven依赖
javax.servlet javax.servlet-api 引入依赖之后,刷新一下maven依赖就可以引入相关的jar包了。
依赖传递
依赖具有传递性,当我们引入了一个依赖的时候,就会自动引入该依赖引入的所有依赖,依次往下引入所有依赖。
比如我们引入了druid数据库连接池的springboot-starter,那么就会自动引入一些依赖
依赖传递
如图,我们仅仅引入了druid-spring-boot-starter依赖,就自动引入了该依赖依赖的依赖。总而言之就是套娃就完事了。
我们将这三个依赖称为间接引入的依赖,而我们在标签中引入的依赖称为直接依赖,那么如果这两个重复了并且版本不一样的话会怎么办呢,最后引入的到底是哪个版本呢,还是说都会引入呢?
如果重复了,遵从以下规则
maven依赖重复后遵的规则
简单来说,就是越在外层的优先级越高,如果同级的就按照配置顺序,配置顺序靠前的覆盖配置顺序靠后的。
可选依赖
可选依赖指对外隐藏当前所依赖的资源
junit junit 4.12 true 配置了该选项之后,间接依赖就失效了。
排除依赖
排除依赖指主动断开间接依赖的资源
junit junit 4.12 org.hamcrest hamcrest-core 配置了该选项之后,间接依赖也会失效。
排除依赖和可选依赖的区别:
可选依赖是依赖提供者设置的,比如我们引入了durid,那么该选项由durid开发者设置
排除依赖由依赖引入者设置,比如我们引入了durid,那么我们可以设置该选项
依赖范围
依赖的jar默认情况可以在任何地方使用,可以通过scope标签来改变依赖的作用范围。
依赖范围
主代码指的是main文件夹下的代码,测试代码指的是test文件夹下的代码(就那个绿色的玩意),打包指的是maven package指令执行时是否将jar包打包。
其实如果我们偷懒的话,全部都默认也不是不可能,不过为了我们程序代码的可读性与简洁性,还是按照规范来比较好。
基于 spring boot + mybatis plus + vue & element 实现的后台管理系统 + 用户小程序,支持 rbac 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
项目地址:https://github.com/yunaiv/ruoyi-vue-pro
视频教程:https://doc.iocoder.cn/video/
生命周期与插件
项目构建生命周期
maven项目构建生命周期描述的是一次构建过程经历了多少个事件,我们可以把生命周期当成一个人的年龄。
maven将生命周期划分为三个大阶段,类似于人类的婴儿,青年,入土
clean:清理工作
default:核心工作,例如编译,测试,打包,部署
site:产生报告,发布站点
第一个和第三个周期比较简单,我们重点介绍一下default阶段
先上一张劝退图
劝退图
以上就是defalut阶段完整的生命周期,其中标红的地方,是几个比较重要的周期,在idea的maven工具中也能体现出来
maven生命周期
当我们在idea中点击这几个生命周期时,maven会自动将之前所有的生命周期都执行到,就类似于如果我18岁了,那么我肯定经历过8岁。
插件
插件就是idea中maven工具的plugins部分
maven插件
通过pom文件中的标签引入新的插件
org.apache.maven.plugins maven-compiler-plugin 3.1 1.8 1.8 utf-8 那么什么是插件呢?
「插件与生命周期内的阶段绑定」 ,在「执行到对应生命周期时执行对应的插件功能」
默认maven在各个生命周期上绑定有预设的功能
通过插件可以自定义其他功能
org.apache.maven.plugins maven-source-plugin 2.2.1 jar generate-test-resources 上述自定义插件的作用指的是在generate-test-resources生命周期执行打jar包的操作。
其实简单的说,生命周期就是一个人的年龄阶段,而插件就是每个人在每个年龄需要做的事情
总结:
总结
maven将一个项目构建的过程分为一长串连续的生命周期,在对应的生命周期会通过插件完成对应的事件,通过使用maven的生命周期,我们可以获得我们需要的功能,可能是打jar包,可能是安装到本地仓库,可能是部署到私服。
基于 spring cloud alibaba + gateway + nacos + rocketmq + vue & element 实现的后台管理系统 + 用户小程序,支持 rbac 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
项目地址:https://github.com/yunaiv/yudao-cloud
视频教程:https://doc.iocoder.cn/video/
模块聚合
当使用maven进行多模块开发的时候,有可能出现a模块依赖b模块,b模块依赖c模块,那么我们如果想对a模块打包,那么就要先打包c模块,再打包b模块,最后打包a模块才能成功,否则会报错,并且,如果c模块更新了,我们也要手动更新所有依赖c模块的模块,这样是及不方便的,maven为了更好的进行多模块开发,提供了模块聚合的功能。
作用:「聚合用于快速构建maven工程,一次性构建多个项目/模块」
使用步骤,我们用开源项目ruoyi的项目结构来看一下聚合在ruoyi中的使用
项目结构
ruoyi-vue父模块的pom文件
ruoyi-admin ruoyi-framework ruoyi-system ruoyi-quartz ruoyi-generator ruoyi-common pom 直接对打包类型为pom的模块进行生命周期的管理,maven会自动帮我们管理聚合的所有模块的生命周期,操作顺序跟依赖顺序有关系。
模块继承
还是在多模块项目开发中,多个子模块可能会引入相同的依赖,但是他们有可能会各自使用不同的版本,版本问题,有可能会导致最后构建的项目出问题,所以我们需要一种机制,来约定子模块的相关配置,于是就有了模块继承
作用:通过继承可以实现在子工程中沿用父工程中的配置
实现步骤:还是以ruoyi为例
在子工程中声明其父工程坐标与对应的位置
ruoyi com.ruoyi 3.8.1 在父工程中定义依赖管理
org.springframework.boot spring-boot-dependencies 2.5.8 pom import com.alibaba druid-spring-boot-starter ${druid.version} org.mybatis.spring.boot mybatis-spring-boot-starter ${mybatis-spring-boot.version} com.github.pagehelper pagehelper-spring-boot-starter ${pagehelper.boot.version} 定义完成之后,子工程相关的依赖就无需定义版本号,会直接使用父工程的版本号
com.github.pagehelper pagehelper-spring-boot-starter 继承除了依赖版本号之外,还会继承一些资源,如下图
模块继承
属性
在maven中,对于有些依赖可能需要保证相同的版本,比如spring相关依赖,那么我们就需要一个机制来保证这些依赖的版本都相同,我们可以使用maven中的属性,类似编程语言的全局变量。
maven中有很多属性:
自定义属性
内置属性
setting属性
java系统属性
环境变量属性
此处我们重点讲解一下
自定义属性
作用:将一些字符串定义为变量,方便统一维护
使用步骤:还是以ruoyi为例
定义自定义属性
3.8.1 调用:${xxx.yyy}
com.ruoyiruoyi${ruoyi.version} 内置属性
作用:使用maven内置属性,快速配置一些文件
${basedir}${version} setting属性
作用:使用maven配置文件setting.xml中的标签属性,用于动态配置
${settings.localrepository}
java系统属性
作用:读取java系统属性
调用格式
${user.home} 系统属性查询方式
mvn help:system
环境变量属性
作用:使用maven环境变量
${env.java_home}
版本管理
对于我们的项目来说,如果我们将其放到一些maven仓库中,那么就需要对其进行版本控制,我们可以看一下一些开源项目的maven官网上的版本。
版本管理
pom文件配置
1.0.0.release
工程版本号约定
工程版本号约定
工程版本
工程版本
环境配置
一个项目,开发环境、测试环境、生产环境的配置文件必然不同,那么maven就需要进行多环境配置管理
maven多环境对应idea中maven工具的profiles
环境配置
配置文件:通过配置文件配置,一个profile代表一个可选项
local local debug dev dev debug true test test debug prod prod warn 然后我们在application.yml配置文件中设置即可,之后通过设置maven的profiles,就可以动态调整环境了。
动态调整环境
私服
maven私服指的是企业自己搭建的maven仓库,通过maven私服,第三方组织可以把自己组织内部的maven依赖安装到私服上,提供给组织内部使用,搭建完私服之后,通过配置maven,我们不止可以从中央仓库中获取maven依赖,还可以从私服中获取maven依赖。
下图是获取资源的过程,中央仓库的资源会从中央仓库获取,其他资源会从私服仓库获取
maven私服
私服搭建
通过nexus搭建私服
nexus是sonatype公司的一款maven私服产品
下载地址:https://help.sonatype.com/repomanager3/product-information/download
私服搭建
私服仓库介绍
安装好之后我们来看一下私服默认的仓库列表
私服仓库
可以将这些仓库分为三大类
「宿主仓库hosted」 :保存无法从中央仓库获取的资源
自主研发
第三方非开源项目
「代理仓库proxy」
代理远程仓库,通过nexus访问其他公共仓库
「仓库组」 :将若干个仓库组成一个群组,简化配置,它仅仅是一种配置,不是真实的仓库
比如我们可以将二课项目相关的依赖放到一个仓库组中,将抽奖项目的依赖放到一个仓库组中
创建私服仓库
点击create repository
创建私服仓库
选择maven2(hosted)
选择maven2
填入仓库名称
填入仓库名称
创建完之后在仓库列表可见,将新建的仓库加入maven-public仓库组,之后通过该仓库组的url访问
仓库列表
点击maven-public仓库组
仓库组
本地仓库访问私服配置
配置本地仓库访问私服的权限(setting.xml文件),如果你想从这个仓库中获取或者部署资源,那么就需要server配置来验证权限,此处可以是不同的账号密码,不同的用户对于仓库的权限也不同。
「配置servers」
ticknet-release admin admin ticknet-snapshots admin admin 「配置setting.xml的profiles」
artifactory false repo repo xxxx snapshots snapshots-only xxxx 此处的url通过这个copy按钮获取。
copy按钮获取url
「配置激活profiles」
artifactory 之后就可以从私服获取资源了
上传资源到私服
配置项目pom文件
ticknet-release http://localhost:8081/repository/ticknet-release/ ticknet-snapshots http://localhost:8081/repository/ticknet-release/ 配置完执行生命周期的deploy即可
ok,大功告成。
的作用
为了规范一个复杂项目中所有子模块的依赖版本,防止出现两个子模块a,b引用同一个依赖,但是一个的版本是1.0,一个的版本是2.0的这种情况。
比如子模块a和b,都引入了x,y,z三个依赖,这三个依赖的版本都要求是相同的的才能匹配上,此时子模块a引入的是1.0的版本,子模块b引入的是2.0的版本,那么最后可能会出现版本不相同导致匹配不上的问题。所以都在父工程的进行依赖版本管理。
基于嵌入式操作系统VxWorks的图形界面开发
全球PC市场Q3出货同比下降9%,预计2024年强势反弹
通过这10个基础命令开始掌握Linux命令行
SLOC方案实现传统模拟CVBS和数字IP视讯同时传输
2019年华为将助力5G在全球大规模建设部署和商用
如何理解Maven拉包原理,搞定Maven构建项目
ADAS助推车载CIS朝高像素、高动态迭代
铝碳化硅基板是什么 铝碳化硅基板市场分析
紫光展锐首款5G芯片产品已流片
区块链策略类放置游戏魔法学院介绍
深度解读水系制备富镍NCA正极的长循环性能
DS18B20-PAR/DS18S20-PAR/DS1822-PAR在远程温度检测方面的优势
莫仕加入自动驾驶车辆网络联盟,将与其他的行业领导者开展合作
新品众测——华为智选 海雀智能摄像头3 4K版
大数据和人工智能的发展方向怎样看待
恩智浦扩展车载产品系列--为 GLONASS卫星系统设计的GloTOP
未来汽车行业,三项发展趋势解析
WK3928***-10G系列DC-DC电源模块产品概述
频率自动跟踪功能超声波清洗电源发生器
虚拟现实会议逐渐成为远程会议市场的主力军