Я использую Guava-05-snapshot с JDK 1.6 Sun аварийные завершения кода, выполняющие этот отрывок:
List<String> badpasswords = Lists.newArrayList( Password.badWords);
Collections.sort(badpasswords);
ImmutableList<String> tmp = ImmutableList.copyOf(badpasswords);
Конкретно на ImmutableList.copyOf () вызов. Этот код работал в течение многих месяцев, с помощью старого кода Наборов Google.
java.lang.NoSuchMethodError: com.google.common.collect.ImmutableList.copyOf(Ljava/util/Collection;)Lcom/google/common/collect/ImmutableList;
Password.badWords
ImmutableSet<String>
и создание перезаписываемого массива и вида работает отлично. Но попытки преобразовать Массив в ImmutableList
сбой.
Guava - это полностью совместимый надмножество коллекций Google - мы ничего не меняли несовместимым образом. (Это проверяется запуском всего набора тестов Google Collections (который является обширным ) против последней банки гуавы.)
Я считаю, что у вас есть копия google-collect - *. Jar, которая все еще создает свою путь в ваш путь к классам. Либо явно, либо потому, что какой-то другой jar включал его без переупаковки. Вам просто нужно найти его и удалить.
В Коллекциях Google был метод ImmutableList.copyOf (Iterable)
, и не было общедоступного метода ImmutableList.copyOf (Collection)
. И это нормально, потому что коллекция также является итерируемой. В Guava мы добавили перегрузку Collection. Это полностью совместимо, так как все источники, которые использовались для компиляции, все еще могут, и любой ранее скомпилированный источник будет просто ссылаться на исходный метод.
Проблема возникает, если вы компилируете с использованием Guava, но затем запускаете его с коллекциями Google. Я считаю, что это вполне вероятно.
Это также отлично работает для меня с использованием официального (без снимка) Выпуск guava-r05 от Maven. Между прочим, это может быть немного более приятным способом сделать то же самое:
ImmutableList<String> sorted = Ordering.natural()
.immutableSortedCopy(Password.badWords);