NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.direct Экстренный вызов в консоли Elastic Search
При создании Elasticearch Client я получаю исключение java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.directExecutor() Ljava/util/concurrent/Executor;
После некоторого поиска швы, подобные Guava-18, переписываются более старой версией во время выполнения, а Guava-18 работает только во время компиляции.
Конфигурация My Maven - это следующее:
<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>
Как я могу заставить версию Guava-18 во время выполнения?
Ответы
Ответ 1
Вы должны попытаться найти, откуда берется "старая" версия guava и исключать ее один раз для всех.
Найти зависимость:
mvn dependency:tree | grep guava
Исключить:
<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>
Подробнее о исключении зависимостей см. https://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html.
Ответ 2
Я добавляю правильную зависимость elasticsearch решить проблему
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
Ответ 3
Я также видел сообщение об ошибке, упомянутое OP при создании экземпляра клиента Elasticsearch. В моем случае это происходило в приложении Spring Boot при запуске приложения. Spring Boot пытался автоматически настроить клиент Elasticsearch с помощью зависимостей, предоставленных spring-boot-starter-data-elasticsearch
. Основная версия гуавы была представлена:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
Это все работало нормально, пока я не представил следующую зависимость google-api-client
...
<dependency>
<groupId>com.google.api-client</groupId>
<artifactId>google-api-client</artifactId>
<version>1.23.0</version>
</dependency>
... который зависит от следующих зависимостей гуавы:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava-jdk5</artifactId>
<version>17.0</version>
</dependency>
Это вызвало коллизию пути к классу, и исправлением было исключить старую версию гуавы из google-api-client
следующим образом:
<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>
Ответ 4
Добавить блок dependencyManagement
решает эту проблему:
<dependencyManagement>
<!-- enforce dependency guava version 20.0 -->
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>20.0</version>
</dependency>
</dependencies>
</dependencyManagement>
Ссылка:
http://techidiocy.com/maven-dependency-version-conflict-problem-and-resolution/
Ответ 5
У меня была аналогичная проблема. Я создал файл .jar (источник Java), затем я хотел загрузить этот файл в Spark Shell. Оказывается, Spark Shell загружает банки из чего-то подобного этому
искра- [версия] -bin-hadoop [версия]/jars/".
В этом каталоге была более ранняя версия guava, которая вызывает ошибку. У меня была правильная версия в моем pom.xml. Я даже добавил исключения и все предлагаемые ответы. В заключение, это действительно неправильная версия guava. Я скопировал версию, соответствующую моему файлу pom.xml. Надеюсь это поможет. С наилучшими пожеланиями.
Ответ 6
SOLVED: я обновил зависимость Guava до последней версии и решил
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>latest</version>
</dependency>
Ответ 7
Я боролся с этой проблемой в течение последних 2 месяцев и, наконец, нашел решение.
Я добавил слишком много внешних jar файлов в свою структуру проекта, что на самом деле создало некоторые jar файлы в Library Root, что приводит к конфликтам при добавлении чего-либо в pom.xml.
Так что нужно сделать, это удалить все внешние файлы JAR из вашего проекта и сохранить только те, которые из Maven, как Maven: org...
Структура моего проекта:
![image]()
Ответ 8
Для решения SBT:
Используйте затенение библиотеки в 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.**" -> "[email protected]").inAll
)
Ответ 9
Лучшее решение - использовать плагин Shade для Maven. Добавление этого в ваш pom.xml должно исправить это:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<relocations>
<relocation>
<pattern>com.google.common</pattern>
<shadedPattern>shaded.com.google.common</shadedPattern>
</relocation>
</relocations>
<artifactSet>
<includes>
<include>com.google.guava:guava</include>
</includes>
</artifactSet>
</configuration>
</execution>
</executions>
</plugin>
Это создаст верхнюю банку с тем же именем, включающую только затененную гуаву внутри.