NoSuchMethodError:com.google.common.util.concurrent.MoreExecutors.directExecutor在Elastic Search jar上进行conflits

时间:2016-02-02 15:38:11

标签: java maven elasticsearch jar guava

创建Elasticsearch客户端时,我收到异常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版本?

9 个答案:

答案 0 :(得分:19)

你应该试着找到&#34; old&#34;番石榴的版本取自并一次性排除。

找出依赖关系:

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

答案 1 :(得分:3)

我添加了elasticsearch的正确依赖关系来解决问题

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>18.0</version>
</dependency>

答案 2 :(得分:1)

在创建Elasticsearch Client实例时,我还看到了OP提到的错误消息。就我而言,它是在应用程序启动时在Spring Boot应用程序中发生的。 Spring Boot试图通过spring-boot-starter-data-elasticsearch引入的依赖关系来自动配置Elasticsearch Client。引入的基础番石榴版本为:

<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>

...其中depends on遵循番石榴依赖项:

<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>

答案 3 :(得分:0)

添加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/

答案 4 :(得分:0)

我有类似的问题。我创建了一个 .jar 文件(Java源代码),然后我想将该文件加载到 Spark Shell 中。事实证明,Spark Shell从类似的东西加载罐子 spark- [版本] -bin-hadoop [版本] / jars /“

该目录中有较旧版本的番石榴,导致错误。我的 pom.xml 中有正确的版本。我甚至添加了排除和所有建议的回复。总之,它确实是番石榴的错误版本。我复制了匹配我的pom.xml文件的版本。希望这可以帮助。问候。

答案 5 :(得分:0)

解决:我将Guava依赖关系更新为最新版本并解决了

 <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>latest</version>
</dependency>

答案 6 :(得分:0)

过去两个月来我一直在努力解决这个问题,终于找到了解决方案。

我在项目结构中添加了过多的外部jar,实际上在
pom.xml 中添加了一些jar,这实际上在Library Root中创建了一些jar。

所以需要做的是从项目中删除所有外部jar文件,并仅保留来自Maven的文件,例如Maven:org ...

我的项目结构:

image

答案 7 :(得分:0)

对于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.**" -> "shadeio.@1").inAll
)

答案 8 :(得分:0)

最好的解决方法是将阴影插件用于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>

这将创建一个具有相同名称的上盖罐,其中仅包含一个阴影番石榴。