介绍
我们会经常在maven项目中,依赖第三方的sdk或者api。当依赖的多了就会发生一个问题。例如有2个依赖的某个类的包名和类名完全相同,但这两个依赖的这个类的方法不完全相同。这就不好办了。用一个,另一个就会有问题。
解决
至于网上说的那种自定义类加载器也不现实,因为这两个依赖的类的方法不相同。就算用自定义类加载器,那代码本身不还是报错吗。
所以这里我们借用maven的一个插件,叫maven-shade-plugin
案例
<dependencies><dependency><groupId>com.yun1</groupId><artifactId>oos-yun1-sdk</artifactId><version>6.5.0</version></dependency><dependency><groupId>com.yun2</groupId><artifactId>oos-yun2-sdk</artifactId><version>1.7.0</version></dependency>
</dependencies>
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>3.2.4</version> <!-- 使用最新版本 --><executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration><artifactSet><includes><!-- 指定依赖 --><include>com.yun2:oos-yun2-sdk</include></includes></artifactSet><relocations><relocation><!-- 原先包名 --><pattern>com.yun</pattern><!-- 修改后包名 --><shadedPattern>com.my.yun</shadedPattern></relocation></relocations></configuration></execution></executions></plugin></plugins>
</build>
- 比如说依赖了两个依赖yun1-sdk、yun2-sdk。这两个sdk都有个类叫 com.yun.FileOs
这时就可以通过maven的插件maven-shade-plugin
,指定要修改的依赖,然后将之前包名可以指定为修改后的包名。修改包名的源码会被打包在项目中。这样yun2-sdk
中就变成了com.my.yun.FileOs
这样两个类就不冲突了。
注意
maven-shade-plugin
插件只会在进行maven打包时候生效。在本地编译器idea启动项目,插件还是不生效的,代码依旧会冲突报错。所以我们可以将这两个依赖和插件放到另一个项目组件包中,将这个组件包打好包后上传到maven私服中。然后要调用此两个sdk的项目依赖这个打好的组件包。这样的话本地编译器idea启动也是没有问题的。