• jar包冲突与inode


    包冲突

    几乎上点规模的java系统就会遇到jar冲突,不负责任的讲排除依赖成了每次发布上线前必做的工作。虽然问题的本质都是jar冲突,但是表现上却有很多不同,从NoSuchMethodError,ClassNotFoundException到field找不到,作用域错误;并且触发冲突条件也不相同,最好并且最常见的是在应用启动时抛出异常,比较恶心的是运行时是某些特殊的边界条件下抛出异常特别。
    在某些领域,某些境界提出问题,发现问题比解决问题具有更高的价值,但应用开发显然不属于这种高端领域,对于一般的jar冲突我的做法如下。

    1. 查看log中的异常堆栈信息,在idea中CTRL+N,一般会发现多个类。
    2. 如果1搞不定,可以加入jvm参数-verbose:class,log里会打印出类的加载信息。
    3. 确定jar包名,执行mvn dependency:tree>tree.log。
    4. 如果是lib中的包冲突就排除相应的jar。
    5. 如果不能exclusion,声明一个路径最短,最靠前的dependency。告诉maven,畜生!用这个版本的jar。
    6. 如果是容器||中间件的包和应用lib包冲突,就升级容器||中间件。

    inode

    在jar冲突中有一种情况就是开发/日常是没问题的,生产环境存在冲突,甚至是生产环境中一部分机器存在冲突,这个是因为tomcat等容器的classLoader加载顺序是不排序的,依赖于底层文件系统的顺序,具体到*nix中就是inode的顺序,每个inode中保存了文件系统的一个文件对象的元信息存储,简单的将就是文件在扇区中的索引值。

    可以使用 ls -li 和 stat查看inode,鉴于安全等原因以免引起不必要的麻烦,就不截图了。

    finally

    实际上大部分的jar都是向后兼容的,如果maven能够按照最高版本依赖(其实也是有问题的),而不是最短路径依赖,相信这个问题会好很多。实际开发中,可以使用maven的依赖冲突检测插件进行事先排除;也可以在部署的lib中查找下进行事后处理;有些发布系统会提前告知本次发布相比与上次新增了那些jar,删除了那些jar,这是一个比较好的策略,毕竟更简单的方法具有更好的执行性。

  • 相关阅读:
    Python序列——字符串
    Python序列——序列操作
    Python数字
    Python对象
    Python基础
    关于PATH_INFO SCRIPT_NAME SCRIPT_FILENAME REDIRECT_URL 详解
    转:Nginx配置指令location匹配符优先级和安全问题
    转:mysql 创建一个用户,指定一个数据库
    【洛谷P3384】树链剖分
    【洛谷P1833】樱花
  • 原文地址:https://www.cnblogs.com/minotaursu/p/6432487.html
Copyright © 2020-2023  润新知