Исключение NoSuchMethodError при использовании com.google.common.base.Splitter
Я пытаюсь использовать 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)
Кто-нибудь знает, что я здесь делаю не так?
8 ответов
Я столкнулся с той же проблемой. Оказалось, что я использовал более старую версию гуавы. Перейдите на этот веб-сайт: https://code.google.com/p/guava-libraries/ и загрузите более новую версию.
Кстати,google-collection была переименована в Guava.
Используйте приведенную ниже зависимость, чтобы исправить проблему
Чтобы добавить зависимость от Guava с помощью Maven, используйте следующее:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>19.0</version>
</dependency>
Чтобы добавить зависимость с помощью Gradle:
dependencies {
compile 'com.google.guava:guava:19.0'
}
Ваша проблема в том, что другая библиотека может также содержать библиотеку guava, и она сначала загружается из вашего classpath, а не из той версии, которую вы хотите. Это вызвало бы это исключение во время выполнения.
Существует две версии: 1) com.google.guava:guava:26.0-android 2) com.google.guava:guava:26.0-jre . Скорее всего, вы назначаете неверную версию, как в моем случае
Другой причиной этого является то, что библиотека GSON импортируется до библиотеки Guava.
См.: https://github.com/google/guava/issues/2786
Я импортировал банки из папки в IntelliJ. В итоге получилось добавить "z" рядом с gson (чтобы jar назывался zgson), чтобы Guava импортировал первым.
Для меня это происходит, когда у вас есть зависимость, которая зависит от более ранней версии Guava, и эта зависимость указана первой. Гуава будет разрешена в том месте, где она была найдена первой, а остальные будут игнорироваться.
Исправление заключается в том, чтобы сначала добавить зависимость от гуавы, но будьте осторожны, чтобы не нарушить другие проекты, использующие гуаву
Получил эту проблему недавно. Что помогает, так это переопределить используемую версию Guava для всех зависимостей:
implementation ("com.google.guava:guava") {
version{
strictly '31.1-android'
}
}
Да, это проблема только с библиотекой гуавы. Сохраните обновленную библиотеку и удалите все оставшиеся версии guava, если они у вас есть, и попробуйте. Должно работать нормально.