通过shell脚本排查jar包中类冲突
当我们在线上运行项目时,依赖很多jar包,有时候某个类的全限定名,在多个包中出现,而某个包中的类的方法没有,而且在类加载时,刚好加载了这个类,可能会报找不到方法,或者找不到类的异常,这种情况就可能是类冲突:
如:
java.lang.NoSuchMethodError: com.google.common.base.Objects.toStringHelper(Ljava/lang/Object;)Lcom/google/common/base/Objects$ToStringHelper;
这是可能就需要找一下到底是哪些依赖的jar包中包含了 :com.google.common.base.Objects 这个类,但是我们总不能一个个依赖jar包解压去找吧,如果依赖比较多的话,会有好几百个,不仅耗时耗力,还可能会中风,下面介绍一种使用shell脚本来检索都是哪些jar包中包含了异常中找不到的类或方法,就以上述为列,我们找一下com.google.common.base.Objects这个类在哪些jar包中出现过,方便我们去除掉冲突:
find_class.sh
脚本命令:
#!/bin/sh find_dir=$
find_key=$ jars=`find $find_dir -name '*.jar'`
for jar in $jars
do
ret=`jar tvf $jar | grep $find_key`
if [ "$?" = "" ]; then
echo -e "\e[1;34m${jar}\e[0m: \n\e[2;34m${ret}\e[0m"
fi
done wars=`find $find_dir -name '*.war'`
for war in $wars
do
ret=`jar tvf $war | grep $find_key`
if [ "$?" = "" ]; then
echo -e "\e[1;34m${war}\e[0m: \n\e[2;34m${ret}\e[0m"
fi
done
使用方式:
./find_class.sh <dir_path> <class_name>
示例:找一下com.google.common.base.Objects这个类在哪些jar包中出现过
./find_class.sh lib/ com.google.common.base.Objects

我们看到在guava-21.0.jar和hive-exec-1.2.0.jar中都出现了,且类全限定名相同,这是我们把不需要的jar包去除,依赖冲突就解决了
通过shell脚本排查jar包中类冲突的更多相关文章
- linux下shell脚本启动jar包
本文采用的jar包是通过idea下maven打包的springboot项目. 写这个shell脚本是为了在linux下方便启动jar包时不用输入太多的shell命令,将启动脚本的一系列shell命令整 ...
- 简易shell脚本启动jar包
可参考博客: Shell脚本中$0.$?.$!.$$.$*.$#.$@等的意义 https://blog.csdn.net/csgd2000/article/details/80396996 s ...
- linux下shell脚本执行jar文件
最近在搞一个shell脚本启动jar文件个关闭jar文件的东东.搞得我都蛋疼了.今天晚上终于弄好了 话说,小弟的linux只是刚入门,经过各方查资料终于搞定了.话不多说,下面开始上小弟写的shell脚 ...
- 把封装脚本做成jar包
前提: eclipse, selenium, maven 把二次封装过的脚本做成jar包, 这样可以在新建工程里也调用封装过的方法. 实现步骤: 1. project 右键 => maven = ...
- mavn jar包依赖冲突解决
背景:使用maven很方便,但是引入冲突也很常见.后果很严重,各种不明实体找不到,所以需要对jar包的依赖有一个清晰的认识. 查看冲突 参考:用dependency:tree查看maven引入jar包 ...
- jar包版本冲突,并且要保留两个版本都能使用
问题:在做项目时,遇到jar版本冲突的问题,并且老代码依赖不能用新jar包代替,要保证功能不变须要保证两个jar都能使用 思路:使用runtime 的exec 方式另启线程运行,然后返回结果 解决: ...
- spring maven项目解决依赖jar包版本冲突方案
引入:http://blog.csdn.net/sanzhongguren/article/details/71191290 在spring reference中提到一个解决spring jar包之间 ...
- 解决Maven项目中jar包依赖冲突问题
版本冲突的解决方案 [1]调节原则 [1]路径最短者优先原则 [2]路径相同时,先声明者优先原则 [2]排除原则:用于排除某项依赖的依赖jar包 <dependency> <grou ...
- 解决jar包依赖冲突(idea)
在IDEA状态下查看项目依赖的关系 关系如下图 红色数据jar包冲突 在对应的依赖中出去去冲突依赖
随机推荐
- SpringMVC学习笔记九:拦截器及拦截器的简单实用
SpringMVC中的interceptor拦截器是非常重要的,它的主要作用就是拦截指定的用户请求,并进行相应的预处理和后处理. 拦截时间点在"处理器映射器根据用户提交的请求映射出所要执行的 ...
- ARTS 第 1 周
每周一道算法.点评一篇英文技术文章.学习一个技术技巧.分享一个技术观点和思路 Algorithm 题目:两数和 给定一个整数数组,返回这两个数字的索引,使它们相加为一个指定的数. 因为是返回两个数字的 ...
- 手机预装APP“死灰复燃”,这颗“毒瘤”到底怎么了
离全新智能手机集中发布的8月底.9月初这个时间段越来越近了,iPhone 8等重磅新机也为互联网媒体贡献了足够的流量和热度.但就在大众聚焦于新机时,一个困扰很多人的问题再度冒出头--智能手机上 ...
- Hexo之旅(四):文章编写技巧
hexo 编写文章可以使用以下命令创建hexo new "文件名" #创建的文章会在_pots目录下文章的后缀名是以md命名的文件格式,遵循markdown语法,所以编写文章可以使 ...
- Golang: chan定义问题(7)
通常都是定义读写双向的 chan,定义单向 chan 问题. 专栏的介绍可以参考 <GotchaGolang专栏>,代码可以看<宝库-Gotcha>. 通过 只写 chan 传 ...
- 一文搞懂JVM内存结构+GC
一.jvm是干什么的? 大家都知道java是跨平台语言,一次编译可以在不同操作系统上运行,怎么做到的呢,看下图: javac把写的源代码(java文件),编译成字节码(class文件),字节码部署到l ...
- SpringCloud入门(六): Hystrix监控
Hystrix.stream 监控 <!--. 配置pom文件,引入actuator包--> <dependency> <groupId>org.springfra ...
- MySQL之单表多表查询
#1.单表查询 #单表查询语法 select <字段1,字段2....> from <表名> where <表达式> group by field 分组 havin ...
- ArrayList集合不能使用foreach增加、删除、修改元素的原因
大家先看两段代码 第一段代码: List<String> arrayList1 = new ArrayList<String>(); arrayList1.add(" ...
- Nginx server name配置子域名二级域名
绑定子域名到不同目录(子站) 网站的目录结构为 /var/www/html: ├── fx └── blog└── photo html为nginx的默认网站目录. sudo vi /etc/ngin ...