java.lang.NoSuchMethodError: com.google.common.collect.Sets $ SetView.iterator () Lcom / google / common / collect / UnmodifiableIterator;

Я пытался подключить kafka к elasticsearch с помощью api kafka-connect. Версия Kafka - 0.11.0.0. Я выполнил следующие шаги:

1.Подключение коннектора Elasticsearch:

https://github.com/confluentinc/kafka-connect-elasticsearch.git

2. построить соединитель

$ cd kafka-connect-elasticsearch
$ mvn clean package

3.Затем запускаем скрипт:

$ bin/connect-standalone.sh config/connect-standalone.properties config/elasticsearch-connect.properties

Это вызывает следующее исключение:

Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.collect.Sets$SetView.iterator()Lcom/google/common/collect/UnmodifiableIterator;
    at org.reflections.Reflections.expandSuperTypes(Reflections.java:380)
    at org.reflections.Reflections.<init>(Reflections.java:126)
    at org.apache.kafka.connect.runtime.isolation.DelegatingClassLoader.scanPluginPath(DelegatingClassLoader.java:221)
    at org.apache.kafka.connect.runtime.isolation.DelegatingClassLoader.scanUrlsAndAddPlugins(DelegatingClassLoader.java:198)
    at org.apache.kafka.connect.runtime.isolation.DelegatingClassLoader.initLoaders(DelegatingClassLoader.java:159)
    at org.apache.kafka.connect.runtime.isolation.Plugins.<init>(Plugins.java:47)
    at org.apache.kafka.connect.cli.ConnectStandalone.main(ConnectStandalone.java:68)

Не могу понять, что не так.


person Anant Pathak    schedule 03.09.2017    source источник
comment
Может быть, просто попробуйте установить дистрибутив Confluent с открытым исходным кодом, который включает 0.11 и коннектор Elasticsearch, и следуйте инструкциям QuickStart здесь docs.confluent.io/current/connect/connect-elasticsearch/docs/   -  person Hans Jespersen    schedule 04.09.2017
comment
Я написал весь код без использования Confluent, и сейчас я не планирую переключаться на него. Разве нет решения?   -  person Anant Pathak    schedule 04.09.2017
comment
Это просто предложение, которое поможет вам определить, связана ли проблема с вашей настройкой, вашей средой сборки или самим соединителем Confluent ES.   -  person Hans Jespersen    schedule 04.09.2017
comment
0.11 добавлена ​​изоляция CLASSPATH, поэтому, возможно, у вас нет всех необходимых зависимостей, перечисленных в plugin.path. См. cwiki.apache.org/confluence / display / KAFKA /   -  person Hans Jespersen    schedule 04.09.2017


Ответы (4)


По опыту, эта ошибка означает, что вы добавляете старую версию guava ранее в свой путь к классам. Для правильной работы org.reflections исполнителю Connect требуется guava >= 20.

kafka-connect-elasticsearch или любой другой соединитель, который включает в себя guava 18.0 или старше, запретит запуск рабочего процесса. Это сообщение об ошибке означает, что более старый guava jar был обнаружен первым в пути к классам.

Два решения:

  1. Действительно, как упоминает Ханс Джесперсен, использование изоляции загрузки классов путем установки вашего plugin.path в конфигурации исполнителя Connect позволит соединителю работать как есть, не мешая фреймворку Connect.
  2. Если добавление коннектора в CLASSPATH - ваш единственный вариант, убедитесь, что он добавлен после зависимостей Kafka Connect, чтобы был выбран самый последний guava.
person Konstantine Karantasis    schedule 06.11.2017

Кажется, это описывает ответ на вашу проблему https://github.com/confluentinc/kafka-connect-elasticsearch/issues/104

Это немного сбивает с толку, но после создания коннектора в целевом каталоге остается ряд вещей. Kafka-connect-elasticsearch-.jar - это только файл JAR с кодом соединителя, но он не включает все библиотеки. Один из этих каталогов в целевом каталоге, а именно target / kafka-connect-elasticsearch - * - development / share / java / kafka-connect-elasticsearch /, действительно содержит все библиотеки. Добавьте этот каталог в путь к классам рабочего класса Kafka Connect или скопируйте все эти файлы JAR в каталог, который уже находится в пути к классам.

person Hans Jespersen    schedule 04.09.2017

Для будущих читателей у меня есть аналогичная проблема без использования kafka. Я потратил много часов, пытаясь разобраться в проблеме, и, наконец, у меня есть шаблон.

В своем проекте я использовал ro.isdc.wro4j: wro4j- расширения: 1.8.0 и org.reflections: отражения: 0.9 .11

<dependency>
    <groupId>ro.isdc.wro4j</groupId>
    <artifactId>wro4j-extensions</artifactId>
    <version>1.8.0</version>
</dependency>
<dependency>
    <groupId>org.reflections</groupId>
    <artifactId>reflections</artifactId>
    <version>0.9.11</version>
</dependency>

Конфликт произошел из-за ro.isdc.wro4j: wro4j-extensions: 1.8.0 использовал com.google.javascript: closure- compiler: jar: v20160315, я решил это, исключив com .google.javascript: closure-compiler: jar: v20160315 из файла pom.

<dependency>
    <groupId>ro.isdc.wro4j</groupId>
    <artifactId>wro4j-extensions</artifactId>
    <version>1.8.0</version>
    <exclusions>
        <exclusion>
            <groupId>com.google.javascript</groupId>
            <artifactId>closure-compiler</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.reflections</groupId>
    <artifactId>reflections</artifactId>
    <version>0.9.11</version>
</dependency>

Однако проблема зависит от сборки, и мы не знаем, какая jar может вызвать конфликт. В этом случае вам нужно узнать местоположение банки, выполнив что-то вроде следующего:

CodeSource source = com.google.common.collect.Sets.class.getProtectionDomain().getCodeSource();
if(source != null)
    logger.warn(source.getLocation().toString());

и посмотрите, что будет на выходе. В моем случае вывод

file:/tmp/jetty-0.0.0.0-8087-ROOT.war-_-any-1541284168668078443.dir/webapp/WEB-INF/lib/closure-compiler-v20160315.jar

Надеюсь, ответ поможет вам найти способ решить проблему,

Муграби

person Ahmad AlMughrabi    schedule 08.06.2019

Я столкнулся с этой ошибкой недавно (январь 2020 г.) на моем локальном хосте (macOS Catalina) и смог решить ее, обновив файл .zprofile (оболочка zsh). Если у вас установлена ​​оболочка bash, вы можете вносить изменения в .bash_profile или .bashrc файл.

• Ошибка была вызвана тем, что мой jvm.classpath включал зависимости guava verison ‹20. Мой файл .zprofile экспортировал в hadoop-3.1.1 и apache-hive-3.1.1, что было причиной ошибки.

• Я использую kafka_2.12-2.0.0. Итак, я просто прокомментировал hadoop-3.1.1 & apache-hive-3.1.1 в моем .zprofile и успешно запустил свой коннектор twitter kafka.

• Мне удалось отследить эту ошибку, следуя комментариям в этом ветка @Konstantine Karantasis.

Надеюсь, это будет полезно.

person saurabhynwa    schedule 31.01.2020