• 通过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=$1
    find_key=$2
    
    jars=`find $find_dir -name '*.jar'`
    for jar in $jars
    do
        ret=`jar tvf $jar | grep $find_key`
        if [ "$?" = "0" ]; then
            echo -e "e[1;34m${jar}e[0m: 
    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 [ "$?" = "0" ]; then
            echo -e "e[1;34m${war}e[0m: 
    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包去除,依赖冲突就解决了

  • 相关阅读:
    oc获得设备类型
    oc代码规范
    图片下载进度
    Nsdate的各种常用操作
    学习视频
    ios 编码转换 保存文件
    免费代码托管网站
    两年JAVA程序员的面试总结
    Java 性能优化的 45 个细节
    7年Java游戏后端,被淘汰辛酸史
  • 原文地址:https://www.cnblogs.com/qixing/p/12535772.html
Copyright © 2020-2023  润新知