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>

Это создаст верхнюю банку с тем же именем, включающую только затененную гуаву внутри.