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 ...
随机推荐
- 直播软件开发如何使用FFMPEG推流并保存在本地
最近开发了基于C#的直播软件开发推流器一直不大理想,终于在不懈努力之后研究了一点成果,这边做个笔记:本文着重在于讲解下如何使用ffmpeg进行简单的推流,看似简单几行代码没有官方的文档很吃力.并获取流 ...
- 为什么layui表单不显示?
当你使用表单时,Layui会对select.checkbox.radio等原始元素隐藏,从而进行美化修饰处理.但这需要依赖于form组件,所以你必须加载 form,并且执行一个实例.值得注意的是:导航 ...
- C#泛型用法,附代码示列
C#中的泛型,大致有如下几种:泛型方法,泛型类,泛型接口,泛型委托,泛型约束等 使用泛型的好处一个是为了减少代码量,更主要的是能提高效率,不需要进行拆箱和装箱的操作. 下面是写的简单的例子,共勉,加深 ...
- fork函数拓展
1.fork之后父子进程共享文件:文件引用计数的值改变,共享偏移. 在下面的例子中test.txt为parentchil.如果子进程没有睡眠,两个进程交叉执行,内容不可预测. 1 #include&l ...
- python之路《模块》
1.time模块 FUNCTIONS asctime(...) asctime([tuple]) -> string Convert a time tuple to a string, e.g. ...
- centos使用U盘做启动盘
软件下载地址: http://sourceforge.net/projects/iso2usb/files/latest/download?source=dlp 写于: 2014年08月04日 更新于 ...
- Python_错误调试2018.3.17【待完善】
异常处理 几个提示信息: notice 注意 warning 警告 error 错误 debug 调试 错误处理 1.Try语句 try execpt 2.print() 3.assert断言,当满足 ...
- Vue 计算属性与方法
computed 基本使用 如果数据需要有复杂的计算,则可以在Vue实例中定义计算属性,再交由mustache进行渲染. computed内部其实是通过getttr实现的,所以不用加括号即可完成其下方 ...
- Integer 错误的加锁
多线程同时访问一个Integer加锁的问题,程序运行和想要的结果相差甚远,让我百思不得其解,就下来研究了一下: 在进行多线程同步时,加锁是保证线程安全的重要手段之一.synchronized是大多数程 ...
- Windows SMBv3 CVE-2020-0796 漏洞分析和l漏洞复现
0x00 漏洞描述 漏洞公告显示,SMB 3.1.1协议中处理压缩消息时,对其中数据没有经过安全检查,直接使用会引发内存破坏漏洞,可能被攻击者利用远程执行任意代码.攻击者利用该漏洞无须权限即可实现远 ...