9

Google コレクションの代わりに Guava を使い始めたところです。Splitter クラスはクールに見えました。しかし、私がそれを使用すると、次のようになります。

private static final Pattern p = Pattern.compile(" +");
private static final Splitter usSplitter = Splitter.on(p).trimResults();

スタック ダンプを取得します。

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:662)
        at com.google.common.base.CharMatcher.<clinit>(CharMatcher.java:69)
        at com.google.common.base.Splitter.<init>(Splitter.java:99)
        at com.google.common.base.Splitter.on(Splitter.java:208)

javadoc には、この「com.google.common.base.Platform」について何もありません。そのため、何が問題なのかを推測するのは少し難しいです。

ご覧のとおり、パターンは非常にシンプルです。

4

3 に答える 3

14

java.lang.NoSuchMethodError、目的のメソッドがコンパイル時のクラスパスにあったのに、現在のランタイム クラスパスにないことを示しています。

つまり、この問題を修正するには、ランタイム クラスパスを調整して、コンパイル時に使用した正しいバージョンの API を持つようにする必要があります。また、ランタイム クラスパス全体で異なるバージョンのライブラリが混在していることが原因である可能性もあります。次に、クラスパスをクリーンアップします。

于 2010-06-27T04:49:39.657 に答える
9

どのバージョンの Guava を使用していますか? これはr05で私にとっては完全にうまくいきます。

編集:ここでの特定の問題は、実行時クラスパスに google-collections と guava の両方があることです。Platform(内部クラス) は google-collections に存在しましたが、メソッドがありませんでしたprecomputedCharMatcherSplitterguava jar から適切にPlatformロードされていますが、google-collect jar からロードされています。

于 2010-06-27T03:56:32.440 に答える
3

実際。2つのバージョンのcom.google.common.base.Platformクラスがあり、これらのクラスの1つにメソッドがある場合とない場合があります。

jarファイルの1つを削除してみてください。削除google-collections.jarして残すことをお勧めしgauva.jarます。

それはうまくいくでしょう。

于 2012-09-30T07:11:48.033 に答える