使用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>