Ce conflit survient lorsque les versions de protobuf-java ou httpasyncclient incluses dans le SDK Tablestore pour Java entrent en collision avec les versions importées par d'autres dépendances de votre projet Maven. Utilisez le classifieur jar-with-dependencies pour résoudre ce problème.
Pour diagnostiquer le conflit, exécutez mvn dependency:tree dans votre référentiel et recherchez plusieurs versions de protobuf-java, httpasyncclient ou tablestore dans la sortie.
Description du problème
L'exception suivante se produit lors de l'utilisation du SDK Tablestore pour Java :
Caused by: java.lang.UnsupportedOperationException: This is supposed to be overridden by subclassed
at com.google.protobuf.GeneratedMessage.getUnknownFields(GeneratedMessage.java:225)
Cause
Le SDK Tablestore pour Java dépend de protobuf-java V2.4.1 et httpasyncclient V4.0.2. Si votre projet — ou toute bibliothèque dont il dépend — importe également des versions différentes de ces artefacts, Maven charge des définitions de classes conflictuelles au moment de l'exécution, ce qui déclenche l'exception ci-dessus.
Solution
Basculez vers le classifieur jar-with-dependencies de l'artefact tablestore. Cette variante utilise la relocation de package pour regrouper protobuf-java et httpasyncclient sous un espace de noms renommé, afin qu'ils n'entrent plus en conflit avec d'autres versions de ces bibliothèques sur le classpath.
Ajoutez les éléments suivants à votre fichier pom.xml :
Le classifieur jar-with-dependencies regroupe protobuf-java et httpasyncclient via la relocation de package, supprimant ainsi la dépendance externe envers ces deux bibliothèques.
<dependency>
<groupId>com.aliyun.openservices</groupId>
<artifactId>tablestore</artifactId>
<version>Your current 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>
</dependency>
<dependency>
<!-- For example, the following libraries indirectly depend on Tablestore SDKs -->
<groupId>com.aliyun.xxxxxxx</groupId>
<artifactId>yyyyyy</artifactId>
<version>zzzzzzz</version>
<classifier>jar-with-dependencies</classifier>
<exclusions>
<!-- Remove the indirect dependency on the tablestore library -->
<exclusion>
<groupId>com.aliyun.openservices</groupId>
<artifactId>tablestore</artifactId>
</exclusion>
</exclusions>
</dependency>