2010-06-27 4 views
29

Używam Guava-05-migawki z Sun JDK 1.6 Kod wysadza wykonujący ten fragment:ma takiego błędu metoda: ImmutableList.copyOf()

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

szczególności na ImmutableList.copyOf () połączenie. Ten kod działał przez wiele miesięcy, korzystając ze starego kodu kolekcji Google.

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

Password.badWords jest ImmutableSet<String> i utworzenie tablicy do zapisu i pracy sortowania doskonale. Ale próby zamiany macierzy na nieudane.

+0

Ten sam problem zostanie odebrane w kolejnym pytaniem: http://stackoverflow.com/questions/3126276/splitter-blows-up-on-simple-pattern/3126420#3126420 – BalusC

+2

Należy prawdopodobnie upvote/akceptować odpowiedzi, są przy okazji użyteczne. – ColinD

Odpowiedz

41

Guava jest w pełni kompatybilny z rozszerzeniem Kolekcje Google - nie zmienia niczego w niezgodnym sposób. (Jest to testowane przez uruchomienie całego zestawu testów Google Collections (który jest rozległy) przed ostatnim słojem guawy.)

Wierzę, że masz kopię google-collect - *. Jar nadal sprawia, że ​​trafia do twojego Ścieżka klas. Albo jawnie, albo dlatego, że jakiś inny słoik zawierał go bez przepakowywania. Po prostu musisz go znaleźć i usunąć.

W kolekcjach Google dostępna była metoda ImmutableList.copyOf(Iterable), a także nie było publicznej metody ImmutableList.copyOf(Collection). Co jest w porządku, ponieważ kolekcja jest również iterowalna. W Guava dodaliśmy przeciążenie kolekcji. Jest to całkowicie zgodne, ponieważ wszystkie źródła, które były używane do kompilacji, mogą nadal, a każde źródło wcześniej skompilowane po prostu nadal odwołuje się do oryginalnej metody.

Problem pojawia się, jeśli kompilujesz przeciwko Guava, a następnie uruchamiasz w kolekcjach Google. Wierzę, że to prawdopodobnie się dzieje.

+2

Problem był skutkiem ubocznym Netbeans przechowywania zbyt wiele rzeczy w pamięci podręcznej. "Czystość i kompilacja" nie zrobiły nic, aby naprawić rzeczy. Zrobiłem kompletnie czyste i wbudowałem w każdy słoik w projekcie. Rozwiązaniem było wyjście z Netbeans, przejdź do ~/netbeans/6.7/var/cache i rm -rf * – fishtoprecords

+1

"Guava to w pełni kompatybilny zestaw kolekcji Google" - podobno już nie ma? http://code.google.com/p/gdata-java-client/issues/detail?id=344#c2 –

+0

Tak, niektóre rzeczy rzeczywiście trafiły w ich "przestarzałe od 18 miesięcy" punkty końca życia prawdziwe. –

3

Ten również działa dobrze dla mnie przy użyciu oficjalnego (nie migawki) wydania guawa-r05 z Maven. Nawiasem mówiąc, to może być trochę ładniejszy sposób robi to samo:

ImmutableList<String> sorted = Ordering.natural() 
    .immutableSortedCopy(Password.badWords); 
+0

Podoba mi się ta wersja. Dzięki – fishtoprecords

0

Using Guava bundled with GWT pracował.

Dodałem oba pliki Guava Jar (wersja 13) stąd kod.google.com/p/guava-libraries do mojej wojny/WEB-INF/lib i dodałem guava-13.0.1.jar do mojej ścieżki budowania (kliknij prawym & dodatek zbudować ścieżkę)

1

Jeśli błąd występuje podczas wdrażania aplikacja webowa do WebLogic 12c (ale JAR guava jest w WEB-INF/lib), następująca konfiguracja w weblogic.xml pomoże rozwiązać:

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