記一次protobuf和hbase自帶protobuf版本沖突的解決


 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM