施用 maven shade plugin 解決 jar 或類的多版本沖突
使用 maven shade plugin 解決 jar 或類的多版本沖突
java 應用經常會碰到的依賴的三方庫出現版本沖突,下面舉一個具體的例子。
Dubbo 是一個分布式的服務框架,其中的一種 rpc 實現(dubbo 協議)使用 hessian 3.2.0 來做序列化,另外一種實現(hsf協議)同樣使用了 hesssian,但使用的版本是 3.0.14。如果現在一個應用中同時使用了 dubbo 協議和 hsf 協議,這個時候應用使用哪個版本的 hessian 呢?使用 3.2.0 可能會影響 hsf 協議,如果使用 3.0.14 那么 dubbo 協議會受影響。
maven shade plugin 能夠把項目中依賴的 jar 包中的一些類文件打包到項目構建生成的 jar 包中,在打包的時候它有一個非常重要的特性是支持 relocation。relocation 的意思是把類重命名,比如把 com.caucho.hessian.io.HessianInput 重命名為 hidden.com.caucho.hessian.io.HessianInput,這樣就不會出現沖突了。
下面是項目中 shade 插件的配置。
java 應用經常會碰到的依賴的三方庫出現版本沖突,下面舉一個具體的例子。
Dubbo 是一個分布式的服務框架,其中的一種 rpc 實現(dubbo 協議)使用 hessian 3.2.0 來做序列化,另外一種實現(hsf協議)同樣使用了 hesssian,但使用的版本是 3.0.14。如果現在一個應用中同時使用了 dubbo 協議和 hsf 協議,這個時候應用使用哪個版本的 hessian 呢?使用 3.2.0 可能會影響 hsf 協議,如果使用 3.0.14 那么 dubbo 協議會受影響。
maven shade plugin 能夠把項目中依賴的 jar 包中的一些類文件打包到項目構建生成的 jar 包中,在打包的時候它有一個非常重要的特性是支持 relocation。relocation 的意思是把類重命名,比如把 com.caucho.hessian.io.HessianInput 重命名為 hidden.com.caucho.hessian.io.HessianInput,這樣就不會出現沖突了。
下面是項目中 shade 插件的配置。
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>1.7.1</version> <executions> <execution> <id>shade-hessian</id> <goals> <goal>shade</goal> </goals> <configuration> <artifactSet> <includes> <include>hessian:hessian</include> </includes> </artifactSet> <createSourcesJar>true</createSourcesJar> <relocations> <relocation> <pattern>com.caucho</pattern> <shadedPattern>com.alibaba.dubbo.hsf.hessian.v3_0_14_bugfix</shadedPattern> </relocation> </relocations> </configuration> </execution> </executions> </plugin>
上面的配置把 groupId 為 hessian artifactId 也為 hessian 的依賴中 com.caucho 包下面的所有類重命名為 com.alibaba.dubbo.hsf.hessian.v3_0_14_bugfix 后和項目中的類文件一起打到 jar 包中。
maven 2 就是通過這種方式打包的,可以看一下 maven 2 安裝目錄下 lib 目錄中的那個 jar。