maven依赖问题的出现原因与解决方式
摘要
maven依赖问题作为开发者应该是经常遇到的问题,在个人单独开发单独维护的项目里,可能体现不那么明显,一是自己对导入的jar大部分都很明确,二是出现问题第一解决发现也很快,问题就没那么严重,而在多人协调开发的项目里,则可能会出现很严重的问题,而这些问题很多时候出现频率相当高,而一些隐匿的问题也多纠其本质,主要是1.开发规范缺失(大小公司不可避免)2.对maven构建把握的细节不够,3.开发者习惯等原因,所以本文主要针对2,3中的常见的问题进行列举和提出相应的解决方式。
背景
从公司的项目中可以经常看到maven依赖爆红,而一般也不会影响项目的运行,可能大多数使用的是高低版本兼容性比较好的jar包,所以maven包依赖冲突的解决也被常常忽略,而有些时候可能前任开发者的不规范,会给你后续的解决冲突挖下一个巨大的坑,比如jar包没有被升级,实现却改了,比如升级后,接口没有改,前任实现者将实现方式改了,而且还会导致后来出现一些没有及时被发现的bug,反正出现的原因可能有很多。
常见问题及解决
前置概念
直接依赖:项目中直接导入的jar包,就是直接依赖
传递依赖:项目中没有直接导入的包,可以通过项目直接依赖jar包传递到项目中,就如下文提到的二级以及多级jar的导入。
解决原则
第一声明优先原则:哪个jar包的坐标在靠上的位置,这个jar包就是先声明的,先声明的包坐标下的依赖jar可以优先进入项目中。
第二原则:路径最短优先原则。
第三原则:exclusion原则,推荐使用
当我们要排除某个jar包下依赖包,在配置exclusion标签的时候,内部可以不写版本号,因为此时依赖包使用的版本默认和本jar包一样。
第四原则:使用dependencyManagement
maven工程是可以分父子依赖关系的,凡是依赖别的项目后,拿到的项目的依赖包都是传递依赖,比如当前项目A,被项目B依赖,那么项目A中所有的jar包都会传递到B项目中,B项目开发者,如果再在B项目中导入一套SSM框架的jar包,对于B项目是直接依赖,那么直接依赖的jar包就会把我们A项目传递过去的jar包覆盖掉,为了防止以上情况的出现。我们可以把项目中主要jar包的坐标锁住,那么其他依赖该项目的项目中,即便是有同名jar包直接依赖,也不会覆盖。需要注意的是,使用此标签的pom一般是管理项目版本,做父项目使用,而不能直接作为父项目的直接依赖,父项目若使用jar,需要特别的定义,另外子项目依赖时候也需要声明出来,只不过不需要版本号。它与dependencys的区别就是子项目被动接受与统一接受版本。
树立良好的maven开发习惯
目的更好让用户理解,尽量不要自己调整依赖的先后顺序,新加jar包不要影响别的jar依赖顺序,导入进去看一看,看的原则,是你放入最后一个jar可能依赖的二级jar(低版本),就会覆盖原来的你上面的同二级jar(高版本)或者原来的大于二级的jar(高版本),然后如果不是编译时候,而是实现时候的jar升级依赖,可能在编译时候发现不了问题在运行时候会报错误的问题。
maven依赖问题的出现原因与解决方式的更多相关文章
- 【翻译自mos文章】使用aum( Automatic Undo Management) 时遇到 ORA-01555错误--- 原因和解决方式。
使用aum( Automatic Undo Management) 时遇到 ORA-01555错误--- 原因和解决方式. 參考原文: ORA-01555 Using Automatic Undo M ...
- String内存溢出异常(错误)可能的原因及解决方式
摘要:本Blog主要为了阐述java.lang.OutOfMemoryError:PermGenspace可能产生的原因及解决方式. 当中PermGen space是Permanent Generat ...
- "Insufficient RAM for Flash Algorithms"出错原因及解决方式
"Insufficient RAM for Flash Algorithms"错误通常会有一个"cannot load flash programming algorit ...
- Android Activity启动黑/白屏原因与解决方式
Android Activity启动黑/白屏原因与解决方式 我们新建一个HelloWorld项目,运行在手机上时,Activity打开之前会有一个动画,而这个动画里是全白或者全黑的(取决于你的主题是亮 ...
- Maven依赖版本冲突的分析及解决小结
1:前言 做软件开发这几年遇到了许多的问题,也总结了一些问题的解决之道,之后慢慢的再遇到的都是一些重复性的问题了,当然,还有一些自己没有完全弄明白的问题.如果做的事情是重复的,遇到重复性问题的概率也就 ...
- Tomcat双击startup.bat闪退的原因及解决方式
很久不碰Tomcat了,最近因为种种原因需要重新投入到Java Web的怀抱,所以又重新接触了Tomcat 我下载了tomcat的压缩包将其解压缩到某个位置,我这里是D盘下的tomcat文件夹中,但是 ...
- Eclipse Maven构建WebApp项目资源目录显示不全的原因与解决方式
一.问题展示 1.Eclipse在使用Maven构建WebApp项目的时候,首先Maven的安装和配置都没有问题的,但是构建项目之后,Maven项目要求的几个必须要有的资源目录显示不了: 问题如下图: ...
- 网站跳转到cgi-sys/defaultwebpage.cgi的原因和解决方式
cpanel遇到这种问题,看了这篇文章老鹰主机域名解析A记录教程–关于cgi-sys/defaultwebpage.cgi后,尝试后 首先ping 域名,结果如下 看到没有ping结果 ...
- 使用pymysql进行定时查询数据不更新的原因及解决方式
用python写了一个小脚本定时查询数据库,输出查询结果并写入文件,发现每次查询的结果都是相同的,但是数据库确实在更新数据. 原因: REPEATABLE READ The default isola ...
随机推荐
- Docker(6)- docker info 命令详解
如果你还想从头学起 Docker,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1870863.html 作用 显示 Docker 系统信 ...
- 对hadoop之RPC的理解
因为公司hadoop集群出现了一些瓶颈,在机器不增加的情况下需要进行优化,不管是存储还是处理性能,更合理的利用现有集群的资源,所以来学习了一波hadoop的rpc相关的知识和hdfs方面的知识,以及y ...
- S5830 android 2.3.4和2.3.7
12年元旦买的手机S5830,原机自带2.3.4的系统. 看到人家的机子2.3.6的效果稍微绚一点,动了想刷机的念头. 前两天刷了2.3.7,效果还满意,用的还舒服,感觉就是有些费电, 本来就对智能手 ...
- Interface(接口分享)第一节
一.接口初探 有时候我们传入的参数可能会包含很多的属性,但是编译器只会检查那些必须的属性是否存在,以及类型是否匹配,而咱们要讲的接口其实就是用来描述下面这个例子里的结构,对于接口传入的数据咱们只关心它 ...
- 记在Linux上定位后台服务偶发崩溃的问题
问题描述 在最近的后台服务中,新增将某个指令的请求数据落盘保存的功能.在具体实现时,采用成员变量来保存请求消息代理头,在接收响应以及消息管理类释放时进行销毁.测试反馈,该服务偶发崩溃. 问题分析 测试 ...
- sed1
Linux sed命令 Linux 命令大全Linux sed命令是利用script来处理文本文件.sed可依照script的指令,来处理.编辑文本文件.Sed主要用来自动编辑一个或多个文件:简化对文 ...
- 处理stale的pg
前言 在某些场景下Ceph集群会出现stale的情况,也就是ceph集群PG的僵死状态,这个状态实际上是无法处理新的请求了,新的请求过来只会block,那么我们如何去恢复环境 实践过程 首先模拟sta ...
- rbd无法map(rbd feature disable)
在jewel版本下默认开启了rbd的一些属性 [root@lab8106 ~]# ceph --show-config|grep rbd|grep features rbd_default_featu ...
- 《JavaScript高级程序设计》读书笔记 ---继承
继承是OO 语言中的一个最为人津津乐道的概念.许多OO 语言都支持两种继承方式:接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.如前所述,由于函数没有签名,在ECMAScrip ...
- 纯干货分享!2020阿里java岗笔试面试题总结(附答案)
前言 2020金九银十马上结束,现为大家整理了这次金九银十面试阿里的面试题总结,都是我从朋友那拿到的面试真题,话不多说,满满的干货分享给大家! int a=10是原子操作吗? 是的. 注意点: i+ ...