web-dev-qa-db-ja.com

NoSuchMethodError:Elastic Search jarでcom.google.common.util.concurrent.MoreExecutors.directExecutorがconflits

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バージョンを強制するにはどうすればよいですか?

15
André Alves

グアバの「古い」バージョンの取得元を見つけて、一度だけ除外する必要があります。

依存関係を見つけます。

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 を参照してください。

20
devlearn

Elasticsearchの正しい依存関係を追加して問題を解決します

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

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

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
)
0
Rajiv Singh

解決済み:Guava依存関係を最新バージョンに更新し、解決しました

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

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/

0
Gary Gauh

私は過去2か月間、この問題に苦労していましたが、最終的に解決策を見つけました。

プロジェクト構造に追加した外部jarが多すぎて、実際にライブラリルートにいくつかのjarが作成されたため、pom.xmlに何かが追加されるたびに競合が発生しました。

そのため、プロジェクトから外部jarファイルをすべて削除し、Maven:orgのようなmavenからのもののみを保持する必要があります...

私のプロジェクト構造:

image

0
Garima Thakur

同様の問題がありました。 。jarファイル(Javaソース)を作成してから、そのファイルをSpark Shellにロードしたかった。 Spark Shellはこれに似たものからjarをロードしますspark- [version] -bin-hadoop [version]/jars/"

そのディレクトリには、エラーを引き起こす古いバージョンのグアバがありました。 pom.xmlに正しいバージョンがありました。私も除外とすべての提案された応答を追加しました。結論として、それは確かにグアバの間違ったバージョンです。 pom.xmlファイルにmatchesバージョンをコピーしました。お役に立てれば。よろしく。

0
MaverickZHN