创建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版本?
答案 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 ...
我的项目结构:
答案 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>
这将创建一个具有相同名称的上盖罐,其中仅包含一个阴影番石榴。