使用maven-shade-plugin解决依赖冲突问题
| Java
评论 1 | 点赞 0 | 浏览 841

最近在开发sdk的时候遇到了一个问题,我的sdk中依赖了七牛的sdk,版本是7.7.0,而业务方也依赖了七牛的sdk,版本是7.0.8,要命的是,这两个版本之间存在不兼容的情况,这就导致业务方引入了我的sdk后,无论生效的是哪个版本的七牛sdk,都会出现错误。

折腾了一番发现maven-shade-plugin这个插件可以解决这个问题

maven-shade-plugin在打包项目的时候,可以将某个依赖中的代码打包到jar中,并且路径支持重命名。使用方法参考如下:

<dependencies>
        <dependency>
            <groupId>com.qiniu</groupId>
            <artifactId>qiniu-java-sdk</artifactId>
            <version>${qiniu.version}</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>
                            <shadeTestJar>false</shadeTestJar>
                            <artifactSet>
                                <includes><!--  将com.qiniu开头的依赖代码打包到jar中-->
                                    <include>com.qiniu:*</include>
                                </includes>
                            </artifactSet>
                            <relocations>
                                <relocation><!-- 将com.qiuniu重命名为shaded.com.qiniu-->
                                    <pattern>com.qiniu</pattern>
                                    <shadedPattern>shaded.com.qiniu</shadedPattern>
                                </relocation>
                            </relocations>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>    </build>

在上面的pom文件配置中,引入了maven-shade-plugin插件,并且将com.qiniu开头的依赖包中的代码打包到jar中,然后将com.qiniu重命名为shaded.com.qiniu,这样就可以实现sdk内部的依赖和sdk使用方完全隔离了,我们看一下打包出来的jar的结构:


很明显,打包出来的jar有两个根目录,其中一个是我们自己写的代码,另外一个根目录shaded.com.qiniu是七牛sdk的源码,他被我们一起打包进来了,并且路径重命名了。

再来看一下sdk中对于七牛的调用路径有没有改变,先看源码中的七牛路径:

再看打包后的jar中的七牛路径:


很明显,jar中的七牛路径都是重命名之后的;这样,jar中的七牛代码和业务方自行引入的七牛代码是完全隔离的,路径都不一样了,也就不存在依赖冲突的问题了。


本文作者:不是好驴
本文链接:https://www.baddonkey.cn/detail/48
版权声明:原创文章,允许转载,转载请注明出处

高谈阔论

留言列表