не удалось устранить ошибку: java.lang.NoSuchFieldError: FAIL_ON_SYMBOL_HASH_OVERFLOW — API-интерфейс клиента Java elasticsearch

Я пытаюсь реализовать функцию автозаполнения, используя elaticsearch 6.2.4 и его клиентский API-интерфейс java rest в моем веб-приложении maven, которое работает под Glassfish 4.1. Я столкнулся с следующей ошибкой:

java.lang.NoSuchFieldError: FAIL_ON_SYMBOL_HASH_OVERFLOW

Я кое-что читал об этом и внес соответствующие изменения в зависимости от проекта (внутри pom.xml), потому что все ответы, которые я встречал, привели к конфликту с версией библиотеки Джексона.

вот код, который я пытался запустить:

RestHighLevelClient client = new RestHighLevelClient(
        RestClient.builder(
                new HttpHost("localhost", 9200, "http")
                ));

         SearchRequest searchRequest = new SearchRequest( "trustiser_suggest" );
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        String[] includeFields = new String[] {"member_mname","member_pic","member_fname","member_lname","topic_label"};
        String[] excludeFields = null;
        searchSourceBuilder.fetchSource(includeFields, excludeFields);
 Map<String, List<? extends ToXContent>> contextMap = new HashMap<>();
    contextMap.put("account_state", Collections.singletonList(CategoryQueryContext.builder().setCategory("active").build()));
        SuggestionBuilder termSuggestionBuilder = SuggestBuilders.completionSuggestion("suggest_member" )
                .prefix( str )
                .contexts(contextMap);
        SuggestBuilder suggestBuilder = new SuggestBuilder();
        suggestBuilder.addSuggestion( "suggest-mem", termSuggestionBuilder );

         SuggestionBuilder termSuggestionBuilder1 = SuggestBuilders.completionSuggestion("suggest_topic" )
                .prefix( str )
                .skipDuplicates(true);
        suggestBuilder.addSuggestion( "suggest-top", termSuggestionBuilder1 );
        searchSourceBuilder.suggest( suggestBuilder);


        searchRequest.source( searchSourceBuilder );
        SearchResponse searchResponse = null;

            searchResponse = client.search( searchRequest );

        System.out.println("AutoCompleteMemberTopicccccccccccccccc: "+searchResponse.toString());

мой текущий pom.xml:

 <dependencies>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>
 <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.8.10</version>

</dependency>
<!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch -->
<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>6.2.4</version>

</dependency>
<!-- https://mvnrepository.com/artifact/org.elasticsearch.client/elasticsearch-rest-client -->
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-client</artifactId>
    <version>6.2.4</version>
</dependency>


        <dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>6.2.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.googlecode.json-simple/json-simple -->
<dependency>
    <groupId>com.googlecode.json-simple</groupId>
    <artifactId>json-simple</artifactId>
    <version>1.1.1</version>
</dependency>

    </dependencies>

и ошибка:

java.lang.NoSuchFieldError: FAIL_ON_SYMBOL_HASH_OVERFLOW
    at org.elasticsearch.common.xcontent.json.JsonXContent.<clinit>(JsonXContent.java:57)
    at org.elasticsearch.common.xcontent.XContentFactory.contentBuilder(XContentFactory.java:121)
    at org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder.contexts(CompletionSuggestionBuilder.java:203)
    at com.trustiser.business.ElasticSearchDao1.AutoCompleteMemberTopic(ElasticSearchDao1.java:50)
    at com.trustiser.service.SearchEngineService.searchMemberCategory(SearchEngineService.java:33)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81)
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:151)
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:171)
    at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:152)
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:104)
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:387)
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:331)
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:103)

и, наконец, дерево maven веб-проекта

--- maven-dependency-plugin:2.8:tree (default-cli) @ elasticmavenprojet ---
com.trustiser:elasticmavenprojet:war:1.0-SNAPSHOT
+- javax:javaee-web-api:jar:7.0:provided
+- com.fasterxml.jackson.core:jackson-core:jar:2.8.10:compile
+- org.elasticsearch:elasticsearch:jar:6.2.4:compile
|  +- org.elasticsearch:elasticsearch-core:jar:6.2.4:compile
|  +- org.apache.lucene:lucene-core:jar:7.2.1:compile
|  +- org.apache.lucene:lucene-analyzers-common:jar:7.2.1:compile
|  +- org.apache.lucene:lucene-backward-codecs:jar:7.2.1:compile
|  +- org.apache.lucene:lucene-grouping:jar:7.2.1:compile
|  +- org.apache.lucene:lucene-highlighter:jar:7.2.1:compile
|  +- org.apache.lucene:lucene-join:jar:7.2.1:compile
|  +- org.apache.lucene:lucene-memory:jar:7.2.1:compile
|  +- org.apache.lucene:lucene-misc:jar:7.2.1:compile
|  +- org.apache.lucene:lucene-queries:jar:7.2.1:compile
|  +- org.apache.lucene:lucene-queryparser:jar:7.2.1:compile
|  +- org.apache.lucene:lucene-sandbox:jar:7.2.1:compile
|  +- org.apache.lucene:lucene-spatial:jar:7.2.1:compile
|  +- org.apache.lucene:lucene-spatial-extras:jar:7.2.1:compile
|  +- org.apache.lucene:lucene-spatial3d:jar:7.2.1:compile
|  +- org.apache.lucene:lucene-suggest:jar:7.2.1:compile
|  +- org.elasticsearch:securesm:jar:1.2:compile
|  +- org.elasticsearch:elasticsearch-cli:jar:6.2.4:compile
|  |  \- net.sf.jopt-simple:jopt-simple:jar:5.0.2:compile
|  +- com.carrotsearch:hppc:jar:0.7.1:compile
|  +- joda-time:joda-time:jar:2.9.9:compile
|  +- org.yaml:snakeyaml:jar:1.17:compile
|  +- com.fasterxml.jackson.dataformat:jackson-dataformat-smile:jar:2.8.10:compile
|  +- com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:jar:2.8.10:compile
|  +- com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:jar:2.8.10:compile
|  +- com.tdunning:t-digest:jar:3.0:compile
|  +- org.hdrhistogram:HdrHistogram:jar:2.1.9:compile
|  +- org.apache.logging.log4j:log4j-api:jar:2.9.1:compile
|  \- org.elasticsearch:jna:jar:4.5.1:compile
+- org.elasticsearch.client:elasticsearch-rest-client:jar:6.2.4:compile
|  +- org.apache.httpcomponents:httpclient:jar:4.5.2:compile
|  +- org.apache.httpcomponents:httpcore:jar:4.4.5:compile
|  +- org.apache.httpcomponents:httpasyncclient:jar:4.1.2:compile
|  +- org.apache.httpcomponents:httpcore-nio:jar:4.4.5:compile
|  +- commons-codec:commons-codec:jar:1.10:compile
|  \- commons-logging:commons-logging:jar:1.1.3:compile
+- org.elasticsearch.client:elasticsearch-rest-high-level-client:jar:6.2.4:compile
|  +- org.elasticsearch.plugin:parent-join-client:jar:6.2.4:compile
|  |  +- org.locationtech.spatial4j:spatial4j:jar:0.6:compile
|  |  +- com.vividsolutions:jts:jar:1.13:compile
|  |  \- org.apache.logging.log4j:log4j-core:jar:2.9.1:compile
|  +- org.elasticsearch.plugin:aggs-matrix-stats-client:jar:6.2.4:compile
|  \- org.elasticsearch.plugin:rank-eval-client:jar:6.2.4:compile
\- com.googlecode.json-simple:json-simple:jar:1.1.1:compile
   \- junit:junit:jar:4.10:compile
      \- org.hamcrest:hamcrest-core:jar:1.1:compile

Спасибо :-)


person Ahlem Trustiser    schedule 03.07.2019    source источник


Ответы (2)


Вы правы, это сообщение об ошибке, выдаваемое библиотекой Джексона, которую elasticsearch использует для сериализации и десериализации JSON, и вызвано наличием конфликтующей версии библиотеки Джексона.

Я вижу, что вы явно включаете библиотеку Джексона, определяя зависимость ниже в вашем pom.xml.

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.8.10</version>
</dependency>

И, глядя на ваш mvn tree, я вижу, что elasticsearch также приносит некоторые библиотеки Джексона. Можете ли вы попробовать ниже 2 вариантов?

Вариант 1. Удалите явную зависимость Джексона, о которой я только что упомянул, и выполните чистую сборку. (Обратите внимание, что это с меньшей вероятностью сработает :), но попробовать не помешает.

вариант 2. Я посмотрел на свой проект, и я использую elasticsearch 7.1 и нижеприведенную базовую библиотеку Джексона. com.fasterxml.jackson.core:jackson-core:jar:2.9.8:compile Если вы не можете определить, какая совместимая версия ядра jackson подходит для вашей версии es, вы можете просто обновить до elasticsearch 7.1 и использовать предоставленную мной версию Jackson, и она должна работать.

person user156327    schedule 03.07.2019
comment
привет @Amit Khandelwal, спасибо за быстрый ответ :-) Я уже попробовал первый вариант, и, к сожалению, он не работает. - person Ahlem Trustiser; 03.07.2019
comment
@AhlemTrustiser, да, я подозревал, что поэтому упомянул, что это вряд ли сработает :-), можете ли вы теперь изучить второй вариант? - person user156327; 03.07.2019
comment
И я не мог легко изменить версию ES, потому что я использую его с neo4j, а обновление версии означает поиск определенного модуля для перемещения данных из базы данных в поисковую систему. поэтому я оставлю этот вариант в качестве конечного решения, но я надеюсь не делать этого :-\ - person Ahlem Trustiser; 03.07.2019
comment
@AhlemTrustiser, хорошо, тогда вам нужно выяснить совместимую версию ядра Jackson, кстати, вы предоставили свой полный pom.xml? Если нет, можете ли вы предоставить это также - person user156327; 03.07.2019
comment
привет @Амит Ханделвал, - person Ahlem Trustiser; 04.07.2019
comment
привет дайте мне знать ваш вопрос - person user156327; 04.07.2019
comment
привет @Amit Khandelwal, совместимой версией jackson для эластичного API 6.2.4 является 2.8.10. потому что, когда я не определяю явным образом API jackson в pom.xml, это версия, которая обеспечивается зависимостью ES API. и это весь pom.xml для проекта, который я создаю, чтобы изолировать функциональность для решения проблемы. - person Ahlem Trustiser; 04.07.2019
comment
кажется странным, я попробую создать пример проекта и поделюсь своими выводами - person user156327; 04.07.2019
comment
Большое спасибо, я жду вашей обратной связи! - person Ahlem Trustiser; 04.07.2019

после нескольких дней работы и исследований я наконец нахожу решение своей проблемы. Проблема вызвана конфликтом версий между зависимостями клиентского API высокого уровня ES и теми, которые существуют в модулях Glassfish (одним из них является Jackson-core). Поскольку замена jar каталога модуля Glassfish является рискованной практикой, решение, которое я применил, состоит в том, чтобы затенить зависимость ES и переименовать там пакеты с помощью плагина maven shadow. Ниже приведены шаги для реализации решения:

  1. Create the shaded dependency of ES:
    • Create a java maven project;
    • Pom.xml проекта:
 <modelVersion>4.0.0</modelVersion>
    <groupId>com.trustiser</groupId>
    <artifactId>elasticshade</artifactId>
    <version>6.2.4</version>
    <packaging>jar</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>6.2.4</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.1.0</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>

                            <relocations>
                                <relocation>
                                    <pattern>org.elasticsearch</pattern>
                                    <shadedPattern>hidden.org.elasticsearch</shadedPattern>
                                </relocation>
                                <relocation>
                                    <pattern>org.apache.lucene</pattern>
                                    <shadedPattern>hidden.org.apache.lucene</shadedPattern>
                                </relocation>
                                <relocation>
                                    <pattern>com.fasterxml</pattern>
                                    <shadedPattern>hidden.com.fasterxml</shadedPattern>
                                </relocation>
                                <relocation>
                                    <pattern>org.apache.httpcomponents</pattern>
                                    <shadedPattern>hidden.org.apache.httpcomponents</shadedPattern>
                                </relocation>

                                <relocation>
                                    <pattern>org.hdrhistogram</pattern>
                                    <shadedPattern>hidden.org.hdrhistogram</shadedPattern>
                                </relocation>
                                <relocation>
                                    <pattern>org.slf4j</pattern>
                                    <shadedPattern>hidden.org.slf4j</shadedPattern>
                                </relocation>
                                <relocation>
                                    <pattern>org.yaml</pattern>
                                    <shadedPattern>hidden.org.yaml</shadedPattern>
                                </relocation>
                                <relocation>
                                    <pattern>net.sf.jopt-simple</pattern>
                                    <shadedPattern>hidden.net.sf.jopt-simple</shadedPattern>
                                </relocation>
                                <relocation>
                                    <pattern>joda-time</pattern>
                                    <shadedPattern>hidden.joda-time</shadedPattern>
                                </relocation>
                                <relocation>
                                    <pattern>commons-logging</pattern>
                                    <shadedPattern>hidden.commons-logging</shadedPattern>
                                </relocation>
                                <relocation>
                                    <pattern>commons-codec</pattern>
                                    <shadedPattern>hidden.commons-codec</shadedPattern>
                                </relocation>
                                <relocation>
                                    <pattern>com.tdunning</pattern>
                                    <shadedPattern>hidden.com.tdunning</shadedPattern>
                                </relocation>
                                <relocation>
                                    <pattern>com.github.spullara</pattern>
                                    <shadedPattern>hidden.com.github.spullara</shadedPattern>
                                </relocation>
                                <relocation>
                                    <pattern>com.carrotsearch</pattern>
                                    <shadedPattern>hidden.com.carrotsearch</shadedPattern>
                                </relocation>
                            </relocations>
                            <shadedArtifactAttached>false</shadedArtifactAttached>
                            <artifactSet>
                                <includes>
                                    <include>*:*</include>
                                </includes>
                            </artifactSet>
                            <filters>
                                <filter>
                                    <artifact>*:*</artifact>
                                    <excludes>
                                        <exclude>META-INF/*.SF</exclude>
                                        <exclude>META-INF/*.DSA</exclude>
                                        <exclude>META-INF/*.RSA</exclude>
                                    </excludes>
                                </filter>
                            </filters>                        


                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.PluginXmlResourceTransformer"/>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.trustiser.elasticshade.App</mainClass>
                                </transformer>

                            </transformers>




                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>

    </build>
  • Запустить чистую, сборочную и maven-пакетную цель;
  • Баночка будет создана в "местоположении проекта эластичной тени" \target

    1. Добавьте заштрихованную зависимость от локального репозитория maven:

      • Access to m2 repository from the cmd, the default location is C:\Users\"user".m2\repository , and execute the following command to istall the created dependency: mvn install:install-file -Dfile="location of the shaded elastic dependency".jar -DgroupId="shaded dependency groupe id" -DartifactId="shaded dependency acrifact id" -Dversion="version of the shaded dependency" -Dpackaging=jar
    2. Добавьте заштрихованную зависимость elasticsearch от pom.xml моего веб-приложения maven java вместо прямого использования API-интерфейса высокого уровня elasticsearch.

    3. Чтобы избежать ошибки log4j, я добавляю файл log4j2.properties в каталог ресурсов моего веб-приложения Java:
appender.console.type = Console
appender.console.name = console
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%d{ISO8601}][%-5p][%-25c] %marker%m%n

rootLogger.level = info
rootLogger.appenderRef.console.ref = console
person Ahlem Trustiser    schedule 28.07.2019
comment
У меня была такая же проблема с ошибкой java.lang.NoSuchFieldError: LUCENE_7_3_1, и она была решена путем применения затенения в Lucene. ‹relocation›pattern›org.apache.lucene‹/pattern›shadedPattern›hidden.org.apache.lucene‹/shadedPattern›‹/relocation› - person Nagaraj Vittal; 09.07.2021