首页 > 其他分享 >一招解决所有依赖冲突

一招解决所有依赖冲突

时间:2022-11-29 12:23:42浏览次数:44  
标签:依赖 bytebuddy jar maven 冲突 一招 net

背景介绍

最近遇到了这样一个问题,我们有一个 jar 包 common-tool,作为基础工具包,被各个项目在引用。突然某一天发现日志很多报错。

一看是 NoSuchMethodError,意思是 DisJunction 里 init 方法没找到,但是我检查了代码是有这个方法的啊。

问题定位

当时百度了一下,都说这种情况一般是 jar 包冲突了,但是本地看来下没有 jar 包版本都一致,没有冲突啊,百思不得其解。于是写了个代码看看这个报找不到方法的类到底有没有这个方法。

Constructor<?>[] constructors = Disjunction.class.getConstructors();
    for (Constructor constructor:constructors){
    //查看类的构造器方法
       log.error("find monitor bug:{}",constructor);
    }
    Class targetclass = Disjunction.class;//可以用自己想知道的类替换
    String className = targetclass.getName();
    className = className.replace('.', '/');
    String resource = "/" + className + ".class";
    URL url = targetclass.getResource(resource);
    //查看类的全路径
    log.error("find monitor bug:{}",url.getFile());

打印出来后发现类全路径竟然不是我的包里的,是一个 agent.jar 里面的。

问了下才知道原来是运维添加了一个 agent 到线上环境,里面的 byte-buddy 依赖和我的冲突了。

如果是本地冲突的话,也可以使用 IDEA 里的 Maven Helper 插件,它可以清晰的指出某个包被哪几个包依赖。

解决方案:

在看解决方案之前先来回顾一下Maven的依赖原则:

  • 最短路径优先

即如果我 A->B->C->X1.0,D->E->X2.0,我项目里引入了 A 和 D,那么我的 X 版本是用的 2.0,因为 X2.0 路径最短。

  • 申明顺序优先

如果 A-B-X(1.0) ,A-C-X(2.0) 这样的路径长度一样怎么办呢?这样的情况下,maven 会根据 pom 文件声明的顺序加载,如果先声明了 B,后声明了 C,那就最后的依赖就会是 X(1.0)

解决方案 1:

maven 依赖的顺序是路径优先,所以我们可以在项目的 pom 文件里直接申明版本,这样就比项目里的引入的 jar 包里再引入的依赖优先级要高些。

这种方案的缺点就是因为我这个基础 jar 包好几个项目再用,需要每个项目都要修改。

解决方案 2:

使用 maven 插件 maven-shade-plugin

 <plugin>
                <artifactId>maven-shade-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <artifactSet>
                                <includes>
                                   //替换的范围,只替换下面两个包 <include>net.bytebuddy:byte-buddy</include>
                                    <include>net.bytebuddy:byte-buddy-agent</include>
                                </includes>
                            </artifactSet>
                            <createSourcesJar>true</createSourcesJar>
                            <relocations>
                                <relocation>
                            // 将net.bytebuddy依赖重命名为cn.mmc.net.bytebuddy
                            <pattern>net.bytebuddy</pattern>
                                    <shadedPattern>cn.mmc.net.bytebuddy</shadedPattern>
                                </relocation>
                            </relocations>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

这种做法就是将原有依赖的 jar 包都重命名一下,比如里面的类是 net.bytebuddy.DisJunction,用这个插件后就变为了 cn.mmc.net.bytebuddy.DisJunction,这样类的全路径不一样,就彻底杜绝了依赖冲突的情况。

另外上面的 includes 是指仅指定替换某些依赖里包名是 net.bytebuddy,否则所有包含了 net.bytebuddy 的都会被重命名,这样打出来的 jar 包就会非常大。

总结

为了一劳永逸,我使用了第二种方案 maven-shade-plugin 的方式,发布之后依赖冲突的问题就解决了。

标签:依赖,bytebuddy,jar,maven,冲突,一招,net
From: https://www.cnblogs.com/javammc/p/16935071.html

相关文章

  • Angular2文档学习的知识点摘要——依赖注入
    目录​​目录​​​依赖注入(DI)​​​为什么需要依赖注入?​​​Angular依赖注入​​​配置注入器​​​​在NgModule中注册提供商​​​​在组件中注册提供商​​​​该用......
  • EasyNTS遇到IP冲突时,如何正确更改IP地址?
    在此前的文章中,我们分享过很多关于EasyNTS上云网关平台及硬件的技术性内容,感兴趣的用户可以翻阅往期的文章进行了解。EasyNTS具备内网穿透、组网运维、多协议视频流拉转推、......
  • Vue 2.x源码学习:render方法、模板解析和依赖收集
    众所周知,Vue的脚手架项目是通过编写.vue文件来对应vue里组件,然后.vue文件是通过vue-loader来解析的,下面是我学习组件渲染过程和模板解析中的一些笔记。之前的笔记:应用初......
  • maven把依赖jar打包到一个可执行jar中
    <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</......
  • git-pull 远程代码与本地冲突解决方案
    一.产生冲突的原因团队其他成员修改了某文件并已提交入库,你在pull之前修改了本地该文件,等你修改完代码再pull时,这时会报错如下错误:error:Yourlocalchangestot......
  • 关于Vetur、Prettier、ESLint插件冲突配置问题
      网上关于Vetur、Prettier、ESLint插件的配置问题,零零散散,基本都是各种……,你懂的......
  • 微软Enterprise Library 4.0将支持依赖注入
    下一个微软EnterpriseLibrary的版本——V4——将预置支持依赖注入。依赖注入将通过容器以独立或作为库的一部分来提供。下一个微软EnterpriseLib......
  • C# 依赖注入、控制反转、服务定位等
    //做个笔记   提醒:里面说的服务,其实就是对象(类,new类)插播(与本章节无关):判断两个对象是否是同一个对象:.net中有一个方式:object.ReferenceEquals(对象1,对象2);//返......
  • MAC 解决 vscode vim按键冲突问题
    问题描述在MAC中使用vscode+vim会遇到使用ljk等按键移动光标时候触发其他功能的问题,问题的根源在于mac的按键重复解决办法解决的办法就是为vscode禁用按键重复,在命令......
  • Cent 制作离线rpm包(包括所有依赖项)
    首先yum上能找到这个包,它是以本机现有环境为基础生成的依赖包。如果已经安装完成,这个就做不成了,所以最好用虚拟机先试一下,确保可以安装成功,再回滚,再制作。#安装yum-util......