web-dev-qa-db-ja.com

そのようなメソッドエラーはありません:ImmutableList.copyOf()

私はGuava-05-snapshotをSunのJDK1.6で使用しています。コードは次のスニペットを実行すると爆発します。

List<String> badpasswords = Lists.newArrayList( Password.badWords);
Collections.sort(badpasswords);
ImmutableList<String> tmp = ImmutableList.copyOf(badpasswords);

特にImmutableList.copyOf()呼び出しで。このコードは、古いGoogle-Collectionsコードを使用して、何ヶ月も機能しています。

Java.lang.NoSuchMethodError: com.google.common.collect.ImmutableList.copyOf(Ljava/util/Collection;)Lcom/google/common/collect/ImmutableList;

Password.badWordsImmutableSet<String>そして書き込み可能な配列の作成とソートは完全に機能します。しかし、配列をImmutableListに変換しようとしても失敗します。

31
fishtoprecords

Guavaは完全に互換性のあるGoogleコレクションのスーパーセットです。互換性のない方法で何も変更していません。 (これは、最新のguava jarに対してGoogleコレクションテストスイート全体(拡張)を実行することによってテストされます。)

Google-collect-*。jarのコピーがまだクラスパスに入っていると思います。明示的に、または他のjarファイルに再パッケージせずに含まれているため。あなたはそれを見つけて削除する必要があります。

Googleコレクションには、ImmutableList.copyOf(Iterable)メソッドがあり、パブリックImmutableList.copyOf(Collection)メソッドはありませんでした。コレクションも反復可能であるため、これは問題ありません。 Guavaでは、コレクションのオーバーロードを追加しました。これは完全に互換性があります。これは、コンパイルに使用されたすべてのソースが引き続き可能であり、以前にコンパイルされたソースはすべて、元のメソッドを参照するだけです。

Guavaに対してコンパイルした後、Googleコレクションに対して実行すると、問題が発生します。私はそれが起こっている可能性が高いと信じています。

45

これまた Mavenからの公式(スナップショットではない)guava-r05リリースを使用すると問題なく動作します。ちなみに、これは同じことを行うためのもう少し良い方法かもしれません:

ImmutableList<String> sorted = Ordering.natural()
    .immutableSortedCopy(Password.badWords);
3
ColinD

WebアプリケーションをWebLogic12cにデプロイするときにエラーが発生した場合(ただし、guavaJARはWEB-INF/libにあります)、weblogic.xmlの次の構成が問題の解決に役立ちます。

<container-descriptor>
    <prefer-application-packages>
        <package-name>com.google</package-name>
    </prefer-application-packages>
</container-descriptor>
2
anre

1)guava-XX.X.X.jarを http://code.google.com/p/guava-libraries/ からダウンロードします。2)Eclipseでプロジェクトを右クリックし、ビルドパスを選択してこのjarを追加します。

1
noorani

GWTにバンドルされているGuavaを使用 動作しました。

ここcode.google.com/p/guava-librariesから両方のGuavaJarファイル(バージョン13)をwar/WEB-INF/libに追加し、guava-13.0.1.jarをビルドパスに追加しました(右クリックして追加パスを構築する)

0
eddyparkinson