
使用protobuf生產模板代碼,使用的版本是:
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.6.1</version>
</dependency>
hbase的版本是:1.2.1-cdh5.1.4.0
如果打印maven依賴樹的話,可以看到hbase的protobuf版本是2.5.0
這種情況下打包不會報錯,但是一旦運行就會出錯:
java.lang.ClassNotFoundException: com.google.protobuf.LiteralByteString
那么應該咱么解決?
答案是想辦法向下兼容~ , 就是保留高版本,去除低版本
最終做法是在maven中去掉低版本相關依賴,以我的作為例子:
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>${hbase.version}-${cdh.version}</version>
<exclusions>
<exclusion>
<groupId>org.jboss.netty</groupId>
<artifactId>netty</artifactId>
</exclusion>
<exclusion>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-protocol</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>${hbase.version}-${cdh.version}</version>
<exclusions>
<exclusion>
<groupId>org.jboss.netty</groupId>
<artifactId>netty</artifactId>
</exclusion>
<exclusion>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-protocol</artifactId>
</exclusion>
</exclusions>
</dependency>
但是,經過實際操作證明,上面只是讓你打包不會報錯。但是一旦上線運行起來后就會發現,程序卡主不動了!!
所以,真正解決protobuf3和hbase中的protobuf2.5.0沖突的話,最好的方式就是去改變protobuf3中的包結構,這樣既不影響protobuf3序列化代碼,也不影響hbase的數據傳輸
<!--hbase-shaded , 用來更改hbase中的一些報名,解決protobuf的沖突問題-->
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-shaded-client</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-shaded-server</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.htrace</groupId>
<artifactId>htrace-core</artifactId>
<version>3.1.0-incubating</version>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.6.1</version>
</dependency>
