介绍
我们会经常在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启动也是没有问题的。