Lors de la création d'Elasticsearch Client, je reçois l'exception Java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.directExecutor () Ljava/util/concurrent/Executor; Après quelques recherches, des versions telles que Guava-18 sont écrasées par une version plus ancienne au moment de l'exécution, et Guava-18 ne fonctionne que pendant la tâche de compilation.
Ma configuration Maven est la suivante:
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.Apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Comment puis-je forcer la version de Guava-18 au moment de l'exécution?
Vous devriez essayer de trouver d'où vient la "vieille" version de goyave et de l'exclure une fois pour toutes.
Trouvez la dépendance:
mvn dependency:tree | grep guava
Excluez-le:
<dependency>
<groupId>org.whatever</groupId>
<artifactId>the_lib_that_includes_guava</artifactId>
<version>0.97</version>
<exclusions>
<exclusion>
<artifactId>com.google</artifactId>
<groupId>guava</groupId>
</exclusion>
</exclusions>
</dependency>
Voir https://maven.Apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html pour plus d'informations sur l'exclusion de dépendance.
J'ajoute la dépendance correcte de elasticsearch pour résoudre le problème
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
Je voyais également le message d'erreur mentionné par l'OP lors de la création d'une instance du client Elasticsearch. Dans mon cas, cela se produisait dans une application Spring Boot au démarrage de l'application. Spring Boot tentait de configurer automatiquement Elasticsearch Client via les dépendances introduites par spring-boot-starter-data-elasticsearch
. La version sous-jacente de la goyave importée était:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
Tout fonctionnait bien jusqu'à ce que je présente la dépendance google-api-client
suivante ...
<dependency>
<groupId>com.google.api-client</groupId>
<artifactId>google-api-client</artifactId>
<version>1.23.0</version>
</dependency>
... dont dépend de suivant la dépendance à la goyave:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava-jdk5</artifactId>
<version>17.0</version>
</dependency>
Cela a provoqué une collision de chemin de classe et le correctif était d'exclure l'ancienne version de goyave du google-api-client
comme suit:
<dependency>
<groupId>com.google.api-client</groupId>
<artifactId>google-api-client</artifactId>
<version>1.23.0</version>
<exclusions>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava-jdk5</artifactId>
</exclusion>
</exclusions>
</dependency>
Pour la solution SBT:
Utiliser l'ombrage de la bibliothèque dans build.sbt
// Shading com.google.**
// We need com.google.guava above 18 version but spark uses version 14 and in that we don't have directExecutor() method
// as spark give preference to spark used libraries, our code was failing
assemblyShadeRules in Assembly := Seq(
ShadeRule.rename("com.google.**" -> "shadeio.@1").inAll
)
Résolu: J'ai mis à jour la dépendance de goyave à la dernière version et il a résolu le
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>latest</version>
</dependency>
Ajouter un bloc dependencyManagement
résout ce problème:
<dependencyManagement>
<!-- enforce dependency guava version 20.0 -->
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>20.0</version>
</dependency>
</dependencies>
</dependencyManagement>
Référence:
http://techidiocy.com/maven-dependency-version-conflict-problem-and-resolution/
Je me débattais avec ce problème depuis 2 mois et j'ai finalement trouvé la solution.
J'ai ajouté trop de fichiers externes dans ma structure de projet, ce qui a créé certains fichiers dans Library Root, ce qui entraîne des conflits chaque fois que quelque chose est ajouté dans pom.xml .
Il suffit donc de supprimer tous les fichiers jar externes de votre projet et de ne conserver que ceux qui appartiennent à Maven, comme Maven: org ...
Ma structure de projet:
J'avais un problème similaire. J'ai créé un fichier .jar (source Java), puis je voulais charger ce fichier dans le shell Spark. Il s’avère que Spark Shell charge des bocaux à partir de quelque chose de similaire à ceci spark- [version] -bin-hadoop [version]/jars/".
Ce répertoire avait une version plus ancienne du goyave qui provoquait l'erreur. J'ai eu la bonne version dans mon pom.xml . J'ai même ajouté des exclusions et toutes les réponses suggérées. En conclusion, il s’agit bien d’une mauvaise version de la goyave. J'ai copié la version qui correspond à mon fichier pom.xml. J'espère que cela t'aides. Cordialement.