Использование проблемы Elasticsearch Rest High Client в AEM - PullRequest
3 голосов
/ 18 октября 2019

Я пытаюсь использовать Java High Level Rest Client в Adobe Experience Manager для завершения проекта сравнения между поисковыми системами Lucene, Solr и Elasticsearch .

У меня проблемы с реализацией asticsearh . Вот код:

  • Зависимость в родительском pom.xml (то же самое определено в основном pom.xml)

    <!-- Elasticseach dependencies -->
    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-high-level-client</artifactId>
        <version>7.4.0</version>
    </dependency>
    
  • Единственная строка кода, которую я использую, это из зависимостей выше

    try (RestHighLevelClient client = new 
    RestHighLevelClient(RestClient.builder(new HttpHost(server, port, 
    protocol),
      new HttpHost(server, secondPort, protocol)));)
    {
    
    }
    catch (ElasticsearchException e)
    {
        LOG.error("Exception: " + e);
    }
    

protocol = "http", server = "localhost", port = 9200, secondPort =9201

  • Ошибка

enter image description here

  • Зависимости от IntelliJ

enter image description here

Я знаю, что обычно есть проблемы с версиями зависимостей, но в этом случае все они 7.4.0 . Кроме того ,asticsearch 7.4.0v работает локально на 3 узлах.

Этот проект выполняется на We.Retail проекте, поэтому его легко скопировать. Также весь код с этой ошибкой доступен здесь: https://github.com/tadijam64/search-engines-comparison-on-we-retail/tree/elasticsearch-integration AEM 6.4v.

Любая информация или идея приветствуется.

ОБНОВЛЕНИЕ Я пытался сдобавив следующее для встраивания этих зависимостей извне, поскольку они не являются зависимостями OSGi:

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-scr-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <extensions>true</extensions>
                <configuration>
                    <instructions>
                        <Embed-Dependency>org.apache.servicemix.bundles.solr-solrj, log4j, noggit, zookeeper,
                            elasticsearch-rest-high-level-client
                        </Embed-Dependency>
                        <Embed-Transitive>true</Embed-Transitive>
                        <Embed-Directory>OSGI-INF/lib</Embed-Directory>
                        <Export-Package>we.retail.core.model*</Export-Package>
                        <Import-Package>
                            *;resolution:=optional
                        </Import-Package>
                        <Private-Package>we.retail.core*</Private-Package>
                        <Sling-Model-Packages>
                            we.retail.core.model
                        </Sling-Model-Packages>
                    </instructions>
                </configuration>
            </plugin>
        </plugins>
    </build>

Ошибка остается. Я также попытался добавить его в «пакет экспорта», но ничего не помогает.

И по документации Elasticsearch все, что мне нужно для использования Elasticsearch, это

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.4.0</version>
</dependency>

но тогда NoClassDefFoundErrors происходит. Кажется, это проблема транзитивных зависимостей. Не уверен, но любая идея приветствуется.

Некоторые другие предложения можно найти здесь: https://forums.adobe.com/thread/2653586

Я также попытался добавить его транзитивные зависимости, такие как org.elasticsearch и org. asticsearch.client, но это не работает. Та же ошибка, просто другой класс.

AEM версия 6.4, Java версия: jdk1.8.0_191.jdk

1 Ответ

2 голосов
/ 21 октября 2019

Так что мое предположение было правильным, транзитивные зависимости не были включены, хотя Transitive> trueсуществует.

При запуске asticsearch в качестве поисковой системы на AEM необходимо выполнить следующее:

  • Я добавилвсе переходные зависимости в pom.xml (версии определены в parent / pom.xml):

    <!-- Elasticsearch -->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch-x-content</artifactId>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.plugin</groupId>
            <artifactId>rank-eval-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-imaging</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.plugin</groupId>
            <artifactId>lang-mustache-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpasyncclient</artifactId>
        </dependency>
    

Важно добавить все третий-party зависимости как <<strong> Embed-Dependency > внутри maven-bundle-plugin как это:

    <plugin>
        <groupId>org.apache.felix</groupId>
        <artifactId>maven-bundle-plugin</artifactId>
        <extensions>true</extensions>
        <configuration>
            <instructions>
                <Embed-Dependency>org.apache.servicemix.bundles.solr-solrj, noggit,
                    elasticsearch-rest-high-level-client,
                    elasticsearch,
                    elasticsearch-rest-client,
                    elasticsearch-x-content,
                    elasticsearch-core,
                    rank-eval-client,
                    lang-mustache-client,
                    httpasyncclient;
                </Embed-Dependency>
                <Embed-Transitive>true</Embed-Transitive>
                <Embed-Directory>OSGI-INF/lib</Embed-Directory>
                <Export-Package>we.retail.core.model*</Export-Package>
                <Import-Package>
                    *;resolution:=optional
                </Import-Package>
                <Private-Package>
                    we.retail.core*
                </Private-Package>
                <Sling-Model-Packages>
                    we.retail.core.model
                </Sling-Model-Packages>
                <_fixupmessages>"Classes found in the wrong directory";is:=warning</_fixupmessages>
            </instructions>
        </configuration>
    </plugin>

Важно отметить:

  • Все сторонние зависимости (вне OSGi) должны быть включены в «Embed-Dependency»
  • «Embed-Transitive» должно быть установлено в true, чтобы включить транзитивные зависимости
  • «Import-Package» должен включать «*; resolution: = необязательно», чтобы исключить все зависимости, которые не удалось разрешить, чтобы программа могла нормально работать
  • По какой-то причине произошла ошибкаво время компиляции, когда была добавлена ​​зависимость "asticsearch ", что не важно для этой задачи, поэтому ярешил проигнорировать это так:
<_fixupmessages>"Classes found in the wrong directory";is:=warning</_fixupmessages>

Хоть и вызов, но я наконец-то решил его. В Google много похожих или похожих проблем, поэтому я надеюсь, что это кому-нибудь поможет. Спасибо всем, кто пытался помочь.

...