HBase用到了Guava靠抑,并且版本較舊纸厉,hbase-1.1使用的是guava-12.0.1维哈,我們的項目中有時候也會用到guava帖蔓,往往使用的是新版本的川队,在version 16之后好像是不能向后兼容的奕删,這里也沒多說墓贿,這時候項目啟動會報一些依賴錯誤距潘,要么是hbase依賴的方法找不到孕暇,要么是自家項目依賴的方法找不到仑撞,這時候怎么辦?
java.lang.ClassNotFoundException: com.google.common.base...
java.lang.IllegalAccessError: tried to access method com.google.common.base...
我們不太可能修改hbase的源碼妖滔,所以只能改自家的項目唄隧哮。但是非要降低自己項目的依賴版本嗎?未必座舍。這時候幸好有maven-shade-plugin沮翔,它可以把依賴的包打包進項目的jar,并且可以修改依賴包的包名(relocate)簸州,這樣一來鉴竭,自己項目就可以隨心所欲使用任意版本的guava包了,因為編譯后它使用的是另一個包名下guava類了岸浑。shaded后的它不再需要依賴guava了搏存。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<relocations>
<relocation>
<pattern>com.google.common</pattern>
<shadedPattern>shaded.com.google.common</shadedPattern>
</relocation>
</relocations>
<artifactSet>
<includes>
<include>*:*</include>
</includes>
</artifactSet>
</configuration>
</execution>
</executions>
</plugin>
mvn clean install打包完,target目錄的jar包已經(jīng)被動過手腳了矢洲,其他項目可以引用這個包而不用顧慮它使用的guava版本了璧眠;項目下還會生成一個dependency-reduced-pom.xml,里面已經(jīng)看不到guava了≡鹁玻可以用這個pom來一起發(fā)布jar袁滥。
但有時候hbase和某個第三方的jar的依賴有沖突怎么辦?比如ES和hbase打架了灾螃?答案還是shade题翻。熱心的社區(qū)已經(jīng)為hbase編譯好了shaded的版本,可以直接使用:http://mvnrepository.com/artifact/org.apache.hbase/hbase-shaded-client
參考鏈接:
https://www.elastic.co/blog/to-shade-or-not-to-shade
https://issues.apache.org/jira/browse/HBASE-16403
https://bryantsai.com/how-to-resolve-dependency-conflict-out-of-your-control-e75ace79e54f