摘要

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依赖问题的出现原因与解决方式的更多相关文章

  1. 【翻译自mos文章】使用aum( Automatic Undo Management) 时遇到 ORA-01555错误--- 原因和解决方式。

    使用aum( Automatic Undo Management) 时遇到 ORA-01555错误--- 原因和解决方式. 參考原文: ORA-01555 Using Automatic Undo M ...

  2. String内存溢出异常(错误)可能的原因及解决方式

    摘要:本Blog主要为了阐述java.lang.OutOfMemoryError:PermGenspace可能产生的原因及解决方式. 当中PermGen space是Permanent Generat ...

  3. "Insufficient RAM for Flash Algorithms"出错原因及解决方式

    "Insufficient RAM for Flash Algorithms"错误通常会有一个"cannot load flash programming algorit ...

  4. Android Activity启动黑/白屏原因与解决方式

    Android Activity启动黑/白屏原因与解决方式 我们新建一个HelloWorld项目,运行在手机上时,Activity打开之前会有一个动画,而这个动画里是全白或者全黑的(取决于你的主题是亮 ...

  5. Maven依赖版本冲突的分析及解决小结

    1:前言 做软件开发这几年遇到了许多的问题,也总结了一些问题的解决之道,之后慢慢的再遇到的都是一些重复性的问题了,当然,还有一些自己没有完全弄明白的问题.如果做的事情是重复的,遇到重复性问题的概率也就 ...

  6. Tomcat双击startup.bat闪退的原因及解决方式

    很久不碰Tomcat了,最近因为种种原因需要重新投入到Java Web的怀抱,所以又重新接触了Tomcat 我下载了tomcat的压缩包将其解压缩到某个位置,我这里是D盘下的tomcat文件夹中,但是 ...

  7. Eclipse Maven构建WebApp项目资源目录显示不全的原因与解决方式

    一.问题展示 1.Eclipse在使用Maven构建WebApp项目的时候,首先Maven的安装和配置都没有问题的,但是构建项目之后,Maven项目要求的几个必须要有的资源目录显示不了: 问题如下图: ...

  8. 网站跳转到cgi-sys/defaultwebpage.cgi的原因和解决方式

    cpanel遇到这种问题,看了这篇文章老鹰主机域名解析A记录教程–关于cgi-sys/defaultwebpage.cgi后,尝试后     首先ping 域名,结果如下     看到没有ping结果 ...

  9. 使用pymysql进行定时查询数据不更新的原因及解决方式

    用python写了一个小脚本定时查询数据库,输出查询结果并写入文件,发现每次查询的结果都是相同的,但是数据库确实在更新数据. 原因: REPEATABLE READ The default isola ...

随机推荐

  1. (C#2,.net framework2.0,Visual Studio 2003)之前版本

    (C#2,.net framework2.0,Visual Studio 2003)之前版本归为最初的版本(主要是针对.net framework),其主要定义了最基本的类型.特性. 1.基本的类型 ...

  2. R语言factor类型转numeric

    R 语言中为了进行数据分析,比如回归分析,这时候对于数据表格中的factor类型的数据会带来弊端,比如对因子的每一个数据都进行一次回归,这样就显得很复杂,且违背了我们的初衷,需要把factor转换为n ...

  3. dedecms织梦手机端文章内容页图片不能自适应解决方法

    dedecms织梦手机端文章内容页图片不能自适应解决方法: 方法一修改手机端文章页模板代码: 找到并打开手机端的文章内容页模板,将里面的{dede:field.body/}标签修改一下,改为如下的标签 ...

  4. .NET 5.0正式发布,功能特性介绍(翻译)

    本文由葡萄城技术团队翻译并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 我们很高兴今天.NET5.0正式发布.这是一个重要的版本-其中也包括了C# ...

  5. 最全总结 | 聊聊 Python 办公自动化之 Excel(中)

    1. 前言 上一篇文章中,我们聊到使用 xlrd.xlwt.xlutils 这一组合操作 Excel 的方法 最全总结 | 聊聊 Python 办公自动化之 Excel(上) ​本篇文章将继续聊另外一 ...

  6. Android基础——项目的文件结构(三)

    Android基础--项目的文件结构(三) 代码源文件夹与资源文件夹 [注]此项目文件结构仅限于Android Studio下的Android项目!!! 在一个Android项目中,代码源文件夹有4个 ...

  7. SpringBoot第七集:异常处理与整合JSR303校验(2020最新最易懂)

    SpringBoot第七集:异常处理与整合JSR303校验(2020最新最易懂) 一.SpringBoot全局异常 先讲下什么是全局异常处理器? 全局异常处理器就是把整个系统的异常统一自动处理,程序员 ...

  8. 在windows下安装node-sass失败,提示\node-sass: Command failed,解决方案

    执行命令 yarn add node-sass@4.7.2 --dev --registry=https://registry.npm.taobao.org :报错 出现这个问题的原因一般是网络问题, ...

  9. PyQt5信号与槽关联的两种方式

    目录 通过QtDesigner 手动关联的方式 通过QtDesigner 单击菜单栏切换到信号槽编辑模式 单击控件并拖动鼠标到信号的接收对象上,一般为对话框自己,松开鼠标弹出信号和槽选择框 选中cli ...

  10. uboot分析——初始化

    1.start.S 初始化 icache 看门狗 时钟 DDR 设置栈 初始化串口,并打印 OK 以上完成 lowlevel_init -------------------------------- ...