摘要

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# 中的 ref 已经被放开,或许你已经不认识了

    一:背景 1. 讲故事 最近在翻 netcore 源码看,发现框架中有不少的代码都被 ref 给修饰了,我去,这还是我认识的 ref 吗?就拿 Span 来说,代码如下: public readonl ...

  2. CF777E Hanoi Factory

    DP单调栈优化 看到这道题可以很自然的想到DP 设$dp[i]$表示最后一个$ring$为$i$的最大高度 首先将$b$为第一关键字,$a$为第二关键字,升序排序元素 那么对于$i$来说,它下面的$r ...

  3. Mybatis 批量更新遇到的小问题

    小问题 记一个开发过程中因为小细节的遗漏而引发的 "莫名其妙",公司中有个2B(to B)供应链项目,持久层用的是 JPA,这里我就不吐槽 JPA 了,这种 SQL 嵌入在代码里的 ...

  4. knn-demo

    from __future__ import print_functionfrom numpy import *# 导入科学计算包numpy和运算符模块operatorimport operatorf ...

  5. C#设计模式-责任链模式(Chain of Responsibility Pattern)

    引子 一个事件需要经过多个对象处理是一个挺常见的场景,譬如采购审批流程,请假流程,软件开发中的异常处理流程,web请求处理流程等各种各样的流程,可以考虑使用责任链模式来实现.现在以请假流程为例,一般公 ...

  6. layui table表格详解

    上次做table有些东西 忘记了 这次当作来个分析总结一下  跟大家共同学习 闲话不多说 直接上例子   代码: <form id="form1" runat="s ...

  7. 下载DirectX SDK (June 2010)的地址记录

    从微软官方下载 https://www.microsoft.com/en-us/download/details.aspx?id=6812 下载后截图

  8. Docker - 解决同步容器与主机时间报错:Error response from daemon: Error processing tar file(exit status 1): invalid symlink "/usr/share/zoneinfo/UTC" -> "../usr/share/zoneinfo/Asia/Shanghai"

    问题背景 这里讲解了如何同步容器和主机的时间:https://www.cnblogs.com/poloyy/p/13967532.html 其中使用方法二 docker cp /etc/localti ...

  9. mybatis foreach collection

    原文传递:https://blog.csdn.net/qq_24084925/article/details/53790287 foreach元素的属性主要有 item,index,collectio ...

  10. Linux安装JAVA并且配置环境

    在写之前我先说一下我遇到的坑,我在配置环境的时候由于/etc/profile文件没有配置好导致系统彻底坏掉 1.ls vi等等命令使用不了,报错说找不到命令 2.在重启后虚拟机不能进入桌面 1.下载j ...