zoukankan      html  css  js  c++  java
  • [JAVA/Maven/IDEA]解决JAR包冲突

    1 前言

    想必这个问题,诸多同仁都遇到过。
    很不凑巧,这段时间咱也屡次撞上这问题好几次了。
    因此,实在是有必要说说怎么解决好这问题了0.0

    2 诊断:包冲突的异常信息特征

    • [类定义未发现错误] NoClassDefFoundError
    Caused by: java.lang.NoClassDefFoundError: org/springframework/core/env/EnvironmentCapable
    
    • [方法未发现错误] NoSuchMethodError
    Exception in thread "Thread-9" java.lang.NoSuchMethodError: org.eclipse.jetty.server.Server.<init>(Lorg/eclipse/jetty/util/thread/ThreadPool;)V
            at com.xxl.job.core.rpc.netcom.jetty.server.JettyServer$1.run(JettyServer.java:36)
            at java.lang.Thread.run(Thread.java:745)
    
    • [变量未发现错误] NoSuchFieldError
    Exception in thread "main" java.lang.NoSuchFieldError
    

    3 包冲突的主要原因

    • 情况1:同一JAVA工程,依赖了同一JAR包的两个版本。

    这可能导致:出现同名类(但其内的method、property可能不同)、缺少当前工程中所依赖的Java类。

    • 情况2:同一JAVA工程,依赖了不同JAR包。

    这可能导致:不同JAR包的相同路径中,出现了不同property/method的同名类。何为同名的类?即 类的全限定名相同。

    [Example]
    2个及以上不同JAR包中均使用了同名的类路径路径org.eclipse.jetty.server.Server.java
    而程序真正调用了包冲突导致的错误Server类时,缺少了该方法
    

    4 解决思路与解决过程

    • step0 Web界面点击某项功能时出现故障。 [start]

    • step1 查看 [服务器日志]

    vi /var/ftp/www/myTomcatWebApp/logs/catalina.out
    

    截取有用信息:

    • 方法未发现错误[ NoSuchMethodError ] → 大概率是: 包冲突
    • 关键类: org.eclipse.jetty.server.Server
    Exception in thread "Thread-9" java.lang.NoSuchMethodError: org.eclipse.jetty.server.Server.<init>(Lorg/eclipse/jetty/util/thread/ThreadPool;)V
            at com.xxl.job.core.rpc.netcom.jetty.server.JettyServer$1.run(JettyServer.java:36)
            at java.lang.Thread.run(Thread.java:745)
    
    • step2 搜索该关键类: org.eclipse.jetty.server.Server

    IDEA中打开 Java Web应用的项目源码
    Shift + Shift : (搜索) org.eclipse.jetty.server.Server
    出现多条结果信息,截取有效的信息:

    • org/eclipse/jetty/jetty-server/9.2.22.v20170606/jetty-server-9.2.22.v20170606.jar!/org/eclipse/jetty/server/Server
    • org/eclipse/jetty/jetty-server/9.2.22.v20170606/jetty-all-7.6.0.v20120127.jar!/org/eclipse/jetty/server/Server
    • step3 确认缺陷 / 确认包冲突

    [方法1] 通过step2的信息,可确认包冲突 【推荐】
    即 在【jetty-server】和【jetty-all】两个jar包中Server类共用了org.eclipse.jetty.server的JAVA包路径

    [方法2] 查看[服务器的Java Web应用的lib库] ,可最终确认 包冲突

    [root@zunyi91 ~]# ll  /var/ftp/www/myTomcatWebApp/webapps/myWebApp/WEB-INF/lib | grep jetty
    -rw-r--r-- 1 root root   540685 4月   3 2019 jetty-6.1.26.cloudera.4.jar
    -rw-r--r-- 1 root root  1681148 11月  7 2018 【jetty-all-7.6.0.v20120127.jar】
    -rw-r--r-- 1 root root   127310 11月  7 2018 jetty-http-9.2.22.v20170606.jar
    -rw-r--r-- 1 root root   108325 11月  7 2018 jetty-io-9.2.22.v20170606.jar
    -rw-r--r-- 1 root root    85290 11月 27 2018 jetty-plus-8.1.15.v20140411.jar
    -rw-r--r-- 1 root root    89933 11月 27 2018 jetty-security-8.1.15.v20140411.jar
    -rw-r--r-- 1 root root   420890 11月  7 2018 【jetty-server-9.2.22.v20170606.jar】
    -rw-r--r-- 1 root root   101785 11月 27 2018 jetty-servlet-8.1.15.v20140411.jar
    -rw-r--r-- 1 root root    19141 4月   3 2019 jetty-sslengine-6.1.26.cloudera.4.jar
    -rw-r--r-- 1 root root   177702 4月   3 2019 jetty-util-6.1.26.cloudera.4.jar
    -rw-r--r-- 1 root root   382423 11月  7 2018 jetty-util-9.2.22.v20170606.jar
    -rw-r--r-- 1 root root   110102 11月 27 2018 jetty-webapp-8.1.15.v20140411.jar
    -rw-r--r-- 1 root root    39077 11月 27 2018 jetty-xml-8.1.15.v20140411.jar
    
    • step4 更新项目源码: POM.xml中排除(exclude)冲突包
    ​+ [安装插件] IDEA在安装解决包冲突的插件(Maven Helper) [Setting>Plugins>(Search)"Maven Helper">Install>重启IDEA]
    

    手动下载IDEA插件的URL:

    + [启动插件] IDEA中打开Java Web项目源码的pom.xml,点击插件的启动按钮"Dependency Analyzer"
    + [分析、查看Maven依赖树] 选择"All Dependencies as Tree",在Conflict中搜索"jetty-server"、"jetty-all",即可出现对应JAR包间的依赖树
    + [exclude] 选择任意JAR包,右键,选择“exclude”,即可  对 目标JAT包进行屏蔽
    
    like this.
    • step5 重新打包,重新部署
    • step6 验证测试
    [验证方法1] 功能测试,看该功能/界面的缺陷是否消失。
    [验证方法2] 白盒测试,从代码层诊断是否解决其缺陷。
    

    X 推荐文献

  • 相关阅读:
    linux 网卡配置详情
    linux ftp 添加用户及权限管理
    mysql 权限管理
    linux ftp 安装及相关命令
    linux find 命令
    linux yum 安装及卸载
    linux svn 安装
    cssText方式写入css
    addLoadEvent
    mobile体验效果:增加点击后反馈
  • 原文地址:https://www.cnblogs.com/johnnyzen/p/13494414.html
Copyright © 2011-2022 走看看