最近在开发sdk的时候遇到了一个问题,我的sdk中依赖了七牛的sdk,版本是7.7.0,而业务方也依赖了七牛的sdk,版本是7.0.8,要命的是,这两个版本之间存在不兼容的情况,这就导致业务方引入了我的sdk后,无论生效的是哪个版本的七牛sdk,都会出现错误。
折腾了一番发现maven-shade-plugin这个插件可以解决这个问题
maven-shade-plugin在打包项目的时候,可以将某个依赖中的代码打包到jar中,并且路径支持重命名。使用方法参考如下:
com.qiniu
qiniu-java-sdk
${qiniu.version}
org.apache.maven.plugins
maven-shade-plugin
3.2.4
package
shade
false
com.qiniu:*
com.qiniu
shaded.com.qiniu
在上面的pom文件配置中,引入了maven-shade-plugin插件,并且将com.qiniu开头的依赖包中的代码打包到jar中,然后将com.qiniu重命名为shaded.com.qiniu,这样就可以实现sdk内部的依赖和sdk使用方完全隔离了,我们看一下打包出来的jar的结构:
很明显,打包出来的jar有两个根目录,其中一个是我们自己写的代码,另外一个根目录shaded.com.qiniu是七牛sdk的源码,他被我们一起打包进来了,并且路径重命名了。
再来看一下sdk中对于七牛的调用路径有没有改变,先看源码中的七牛路径:
再看打包后的jar中的七牛路径:
很明显,jar中的七牛路径都是重命名之后的;这样,jar中的七牛代码和业务方自行引入的七牛代码是完全隔离的,路径都不一样了,也就不存在依赖冲突的问题了。
高谈阔论