摘要

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. uniapp使用axios以及封装错误重试解决方案

    在uniapp中,使用axios进行请求时,uniapp无法使用axios的适配器,需要基于uni.request来定义适配器. 安装完成axios后在项目utils目录下建一个axios文件夹 文中 ...

  2. 选择API管理平台之前要考虑的5个因素

    API(应用程序编程接口)经济的飞速增长导致对API管理平台的需求相应增加. 这些解决方案可在整个生命周期内帮助创建,实施,监控,分析,保护和管理API. 据一些估计,全球API管理市场预计在2018 ...

  3. Thinkphp3.2 cms之权限管理

    五.权限管理 <?php namespace Admin\Controller; use Think\Controller; class CommonController extends Con ...

  4. python实现对于告警规则的判断思路

    场景 监控一个后台服务各个url的响应时间,需要在mysql数据库的一张表中设计一个字段需要包含且不仅限于以下一种规则(1. 大于 2. 小于 3. 大于等于 4. 小于等于),表结构大概是这样的 每 ...

  5. python爬虫09selenium

    selenium 变成了爬虫利器 我们先来安装一下 pip install selenium 接着我们还要下载浏览器驱动 小帅b用的是 Chrome 浏览器 所以下载的是 Chrome 驱动 当然你用 ...

  6. leetcode147median-of-two-sorted-arrays

    题目描述 有两个大小分别为m和n的有序数组A和B.请找出这两个数组的中位数.你需要给出时间复杂度在O(log (m+n))以内的算法. There are two sorted arrays A an ...

  7. git 分支合并到master

    [参考:] https://segmentfault.com/q/1010000000181403  我们一般这样:远程创建一个主分支,本地每人创建功能分支,日常工作流程如下: # 去自己的工作分支 ...

  8. 数据采集与融合第四次作业:多线程以及scrapy框架的使用

    数据采集第四次作业:多线程以及scrapy框架的使用 任务一:单多线程的使用 单线程代码: from bs4 import BeautifulSoup from bs4 import UnicodeD ...

  9. 微服务通信之feign的配置隔离

    前言 由上文我们知道针对某一个Feign接口,我们可以给他设置特定的配置类.那如果现在有一个服务,我们只想对A服务配置一个拦截器拦截请求而不影响其他服务,那应该怎么做呢? 一.feign接口配置 由前 ...

  10. linux中suid/sgid/sticky及扩展属性(attr)

    suid只适用于命令文件.(如/usr/bin/passwd) 当命令文件上有suid权限时,则操作用户的权限变成属主权限.命令文件上无suid权限则操作用户的权限不变. 查看suid权限: [roo ...