web-dev-qa-db-ja.com

com.google.common.base.Splitter使用時のNoSuchMethodError例外

次のようにcom.google.common.base.Splitterを使用しようとしています

Iterable<String> segs = Splitter.on("/").split("one/two/three/four/five");

for (String seg : segs) {
  System.out.println(seg);
}

ただし、次の例外が発生します。

Exception in thread "main" Java.lang.NoSuchMethodError: com.google.common.base.Platform.precomputeCharMatcher(Lcom/google/common/base/CharMatcher;)Lcom/google/common/base/CharMatcher;
    at com.google.common.base.CharMatcher.precomputed(CharMatcher.Java:664)
    at com.google.common.base.CharMatcher.<clinit>(CharMatcher.Java:71)
    at com.google.common.base.Splitter.<init>(Splitter.Java:107)
    at com.google.common.base.Splitter.on(Splitter.Java:171)
    at Test.main(Test.Java:30)

私がここで間違っていることを誰かが知っていますか?

22
mip

同じ問題が発生しました。古いバージョンのグアバを使用していることがわかりました。次のWebサイトにアクセスします: https://code.google.com/p/guava-libraries/ 、新しいバージョンをダウンロードします。

ちなみに、google-collectionsはGuavaに名前が変更されました。

10
Sam003

以下の依存関係を使用して問題を修正します

Mavenを使用してGuavaへの依存関係を追加するには、以下を使用します:

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

Gradleを使用して依存関係を追加するには:

dependencies {
  compile 'com.google.guava:guava:19.0'
}
8
YouAreAwesome

問題は、別のライブラリにもguavaライブラリが含まれている可能性があり、必要なバージョンではなく、クラスパスから最初に読み込まれることです。これにより、このランタイム例外が発生します。

2
Kurtymckurt

私にとってこれは、以前のバージョンのGuavaに依存する依存関係があり、この依存関係が最初にリストされている場合に発生します。グアバは最初に見つかった場所で解決され、残りは無視されます。

修正は最初にグアバへの依存関係を追加することですが、グアバを使用する他のプロジェクトを壊さないように注意してください

0
smac89

2つのバージョンがあります:1)com.google.guava:guava:26.0-Android 2)com.google.guava:guava:26.0-jre。ほとんどの場合、私の場合のように間違ったバージョンを割り当てます

0
Andrew Glukhoff

これが発生するもう1つの理由は、GSONライブラリがGuavaライブラリの前にインポートされる場合です。

参照: https://github.com/google/guava/issues/2786

JarをフォルダーからIntelliJにインポートしていました。最終的に機能したのは、gavaが最初にインポートされるように、gsonの横に「z」を追加することです(そのため、jarはzgsonという名前になります)。

0
n4rush0