Elasticsearchクライアントの作成中に、例外Java.lang.NoSuchMethodErrorが発生しています:com.google.common.util.concurrent.MoreExecutors.directExecutor()Ljava/util/concurrent/Executor;いくつかのルックアップの後、Guava-18のような継ぎ目は実行時に古いバージョンによって上書きされ、Guava-18はコンパイルタスク中にのみ機能します。
私の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バージョンを強制するにはどうすればよいですか?
グアバの「古い」バージョンの取得元を見つけて、一度だけ除外する必要があります。
依存関係を見つけます。
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 を参照してください。
Elasticsearchの正しい依存関係を追加して問題を解決します
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
Elasticsearchクライアントインスタンスを作成するときに、OPが言及したエラーメッセージも表示されていました。私の場合、アプリケーションの起動時にSpring Bootアプリで発生していました。 Spring Bootは、spring-boot-starter-data-elasticsearch
によってもたらされた依存関係を介して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>
... which 依存 次のグアバ依存性:
<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>
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
)
解決済み:Guava依存関係を最新バージョンに更新し、解決しました
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>latest</version>
</dependency>
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/
私は過去2か月間、この問題に苦労していましたが、最終的に解決策を見つけました。
プロジェクト構造に追加した外部jarが多すぎて、実際にライブラリルートにいくつかのjarが作成されたため、pom.xmlに何かが追加されるたびに競合が発生しました。
そのため、プロジェクトから外部jarファイルをすべて削除し、Maven:orgのようなmavenからのもののみを保持する必要があります...
私のプロジェクト構造:
同様の問題がありました。 。jarファイル(Javaソース)を作成してから、そのファイルをSpark Shellにロードしたかった。 Spark Shellはこれに似たものからjarをロードしますspark- [version] -bin-hadoop [version]/jars/"。
そのディレクトリには、エラーを引き起こす古いバージョンのグアバがありました。 pom.xmlに正しいバージョンがありました。私も除外とすべての提案された応答を追加しました。結論として、それは確かにグアバの間違ったバージョンです。 pom.xmlファイルにmatchesバージョンをコピーしました。お役に立てれば。よろしく。