zoukankan      html  css  js  c++  java
  • 记一次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>
  • 相关阅读:
    where T: class的解释
    调用钉钉的WebAPI接口实现与ERP数据的同步
    Json序列化和反序列化的方式
    Log4Net日志处理
    MVC项目中异常处理
    FindBI商业智能报表工具
    权限列表实现
    委托,匿名,lambda
    [经典贪心算法]贪心算法概述
    [zt]手把手教你写对拍程序(PASCAL)
  • 原文地址:https://www.cnblogs.com/niutao/p/11122431.html
Copyright © 2011-2022 走看看