Maven依赖三板大斧
一:问题出现场景
记得有一次,面试时候面试官问了个问题,来哥们,“你们项目是maven搭建哈,你的项目里如果出现架包冲突了,你们怎么解决的?”。
我:......,装作很淡定,我们是通过报错,定位哪个架包出问题。
二:场景复现
A依赖于B及C,而B又依赖于X、Y,而C依赖于X、M,则A除引B及C的依赖包下,还会引入X,Y,M的依赖包。
这里有一个需要特别注意的,即B和C同时依赖于X,假设B依赖于X的1.0版本,而C依赖于X的2.0版本,A究竟依赖于X的1.0还是2.0版本呢?
这就看Classloader的加载顺序了,假设Classloader先加载X_1.0,而它就不会再加载X_2.0了,如果A恰恰希望使用X_2.0呢,血案就这样不期而遇了。
三:解决方法
1)第一斧
我们可以通过mvn dependency:tree来查询项目中所有架包依赖控制台打印,或者我们mvn dependency:tree > D:/tree.txt 输入文件
当然第一斧头没这么简单,如果我们项目依赖架包很多,控制台肯定存放不了对吧。那么我们就可以通过 mvn dependency:tree -Dverbose -Dincludes
=groupId:artifactId:version 定位具体哪个架包出现问题。
mvn dependency:tree 按照树形结构输出架包,还可以是 dependency:list
-Dverbose 展示所有引用架包,包括重复引用的或者忽略的
-Dincludes 精确查询到某一个架包
如上两个commons-logging,通过不同的架包引入
2)第二斧
去除掉重复引入的架包。 <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
<!--这里是关键去除的地方-->
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency> 3)第三斧
常见maven优化
1.优化依赖以及分析
mvn dependency:analyze
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
2.归类依赖
在父pom文件中,会${springframwork.version}声明出版本,统一进行版本升级,如下所示
<gravitee-node.version>1.5.0</gravitee-node.version>
<gravitee-definition.version>1.18.0</gravitee-definition.version>
<gravitee-common.version>1.15.0</gravitee-common.version>
3.依赖调节
第一原则:路径最近者优先;
第二原则:路径长度一样时,第一声明者优先。
另外常用的安装jar到自己服务器的命令为:
mvn install:install-file -DgroupId=novaplanet.net -DartifactId=commons-lang -Dversion=2.5 -Dfile=F:/commons-lang-2.5.jar -Dpackaging=jar -DgeneratePom=true
Maven依赖三板大斧的更多相关文章
- Maven依赖版本冲突的分析及解决小结
1:前言 做软件开发这几年遇到了许多的问题,也总结了一些问题的解决之道,之后慢慢的再遇到的都是一些重复性的问题了,当然,还有一些自己没有完全弄明白的问题.如果做的事情是重复的,遇到重复性问题的概率也就 ...
- 解决maven依赖传递中的版本冲突问题
通常情况下,我们都比较喜欢使用maven进行项目管理,要加个依赖包也非常简单,不需要到处去下载jar包,当然除了maven之外,也还有一些非常不错的工具.在使用maven进行项目依赖管理的时候,有时候 ...
- 160929、各数据库连接配置与maven依赖安装
最近做的项目都是maven的,据说maven是个东西.把依赖的jar文件的事情都委托出去辣!试着用了一下哈,效果还可以! 今天做了数据库配置这一块,特意把相关的东西总结出来,以备不时之需. MySQL ...
- Maven依赖(转)
相同依赖级别,先加入的先依赖不同依赖级别,级别短的先依赖 version-->SNAPSHOTxxx-里程碑-->SNAPSHOT,alpha,beta,Release(RC),GA()s ...
- maven依赖的全局排除
今天遇到要全局排除一个maven依赖,因为Maven本身没有全局排除依赖的办法, 参考了同事人英写的一篇博文(可以看这里http://my.oschina.net/liuyongpo/blog/177 ...
- maven依赖传递关系
一.maven 依赖传递规则 举个例子,比如A依赖B,B依赖C,那么A也是依赖C的.A是对B的直接依赖,A对C是传递依赖 ①.最短路劲原则 如,路劲一:A依赖B,B依赖C,C依赖D(1.0.0): 路 ...
- Spring Security 3.2.x与Spring 4.0.x的Maven依赖管理
原文链接: Spring Security with Maven原文日期: 2013年04月24日翻译日期: 2014年06月29日翻译人员: 铁锚 1. 概述 本文通过实例为您介绍怎样使用 Mave ...
- Maven依赖解析
本文将记录Maven工程中依赖解析机制,内容包括: Maven依赖基本结构 从仓库解析依赖的机制 依赖传递性解析实例 1. Maven依赖基本结构 上篇文章记录了Maven依赖的聚合与继承,POM中依 ...
- Maven依赖分析
背景 昨天帮一位同事排查了一个依赖冲突的问题.问题的现象就是在IntelliJ IDEA运行项目正常,但是打包(Maven assembly jar)之后传到服务器运行失败,报错:Caused by: ...
随机推荐
- sublime text 常用插件安装
一.安装方法 ctrl+ship+p —— 在弹出的地方输入 pci (package control: install pagckage)—— 再输入 要安装的包名 二.一步过慢或失败解决: 原因: ...
- 代码方式配置springmvc的字符集过滤器
之前一直用的xml方式配置 <filter> <filter-name>encoding</filter-name> <filter-class>org ...
- composer install、require、update的区别
- Mysql:分支结构—case结构
case结构 情况一:类似于家擦中的switch语句 一般用于实现等值判断 语法: CASE 变量|表达式|字段 WHEN 要判断的值 THEN 返回的值1或语句1; WHEN 要判断的值 THEN ...
- P1012 数字分类
转跳点:
- POJ 2521:How much did the businessman lose
How much did the businessman lose Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9965 ...
- C++ STD Gems06
generate.generate_n.sample.iota #include <iostream> #include <vector> #include <strin ...
- SpringBoot 系列教程之事务不生效的几种 case
SpringBoot 系列教程之事务不生效的几种 case 前面几篇博文介绍了声明式事务@Transactional的使用姿势,只知道正确的使用姿势可能还不够,还得知道什么场景下不生效,避免采坑.本文 ...
- mysql 锁表的处理方式
MySQL错误:ERROR 1205 (HY000): Lock wait timeout 处理方案: 执行mysql命令:show full processlist; 然后找出插入语句的 ...
- 1, vm: PropTypes.instanceOf(VM).isRequired
子模块的文件引入父工程对象时,出现红色warning,提示传入的对象类型不是所要求的类型. 思路是父工程引用的JS包和子模块使用的包不是同一个包,解决办法是父工程和子工程都使用同一个包. resolv ...