当使用表格存储Java SDK出现PB库冲突时,您需要在Maven项目的pom.xml文件中使用jar-with-dependencies版本的tablestore库,并在tablestore库中去除对protobuf-java和httpasyncclient的依赖,以及确认tablestore库本身是否出现库冲突。
说明
如何初步确认是否有PB库、tablestore库冲突?
在您的仓库中,可以通过mvn dependency:tree
打印依赖树,在依赖树中查找protobuf-java、httpasyncclient和tablestore库是否有不同版本的依赖。
现象
使用Java SDK时出现如下异常:
Caused by: java.lang.UnsupportedOperationException: This is supposed to be overridden by subclassed
at com.google.protobuf.GeneratedMessage.getUnknownFields(GeneratedMessage.java:225)
原因
表格存储Java SDK依赖2.4.1版本的protobuf-java和4.0.2版本的httpasyncclient,容易与您的应用程序中自带的相同库冲突;同时如果您依赖的其他库间接依赖了tablestore库,容易与您应用程序直接依赖的tablestore库冲突。
解决方案
在Maven项目中的pom.xml中添加如下依赖即可。
说明
classifier为jar-with-dependencies,它将依赖的protobuf-java和httpasyncclient都通过rename package的方式打包进去,去除了对protobuf-java和httpasyncclient的依赖。
<dependency>
<groupId>com.aliyun.openservices</groupId>
<artifactId>tablestore</artifactId>
<version>替换为您当前使用的版本</version>
<classifier>jar-with-dependencies</classifier>
<exclusions>
<exclusion>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpasyncclient</artifactId>
</exclusion>
</exclusions>
<!-- 假设以下为间接依赖tablestore SDK的库 -->
<groupId>com.aliyun.xxxxxxx</groupId>
<artifactId>yyyyyy</artifactId>
<version>zzzzzzz</version>
<classifier>jar-with-dependencies</classifier>
<exclusions>
<!-- 去除对tablestore库的间接依赖 -->
<exclusion>
<groupId>com.aliyun.openservices</groupId>
<artifactId>tablestore</artifactId>
</exclusion>
</exclusions>
</dependency>