次のように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)
私がここで間違っていることを誰かが知っていますか?
同じ問題が発生しました。古いバージョンのグアバを使用していることがわかりました。次のWebサイトにアクセスします: https://code.google.com/p/guava-libraries/ 、新しいバージョンをダウンロードします。
ちなみに、google-collectionsはGuavaに名前が変更されました。
以下の依存関係を使用して問題を修正します
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'
}
問題は、別のライブラリにもguavaライブラリが含まれている可能性があり、必要なバージョンではなく、クラスパスから最初に読み込まれることです。これにより、このランタイム例外が発生します。
私にとってこれは、以前のバージョンのGuavaに依存する依存関係があり、この依存関係が最初にリストされている場合に発生します。グアバは最初に見つかった場所で解決され、残りは無視されます。
修正は最初にグアバへの依存関係を追加することですが、グアバを使用する他のプロジェクトを壊さないように注意してください
2つのバージョンがあります:1)com.google.guava:guava:26.0-Android 2)com.google.guava:guava:26.0-jre。ほとんどの場合、私の場合のように間違ったバージョンを割り当てます
これが発生するもう1つの理由は、GSONライブラリがGuavaライブラリの前にインポートされる場合です。
参照: https://github.com/google/guava/issues/2786
JarをフォルダーからIntelliJにインポートしていました。最終的に機能したのは、gavaが最初にインポートされるように、gsonの横に「z」を追加することです(そのため、jarはzgsonという名前になります)。