简体   繁体   English

传递依赖:在 AEM 中使用 Elasticsearch Rest 高客户端问题

[英]Transitive Dependency: Using Elasticsearch Rest High Client problem in AEM

I am trying to use Java High Level Rest Client in Adobe Experience Manager to finish project of comparison between Lucene, Solr and Elasticsearch search engines . I am trying to use Java High Level Rest Client in Adobe Experience Manager to finish project of comparison between Lucene, Solr and Elasticsearch search engines .

I am having some problems with elasticsearh implementation .我在执行 elasticsearh时遇到了一些问题。 Here is the code:这是代码:

  • Dependency in the parent pom.xml (the same is defined in core pom.xml)父pom.xml中的依赖(同在core pom.xml中定义)

     <.-- Elasticseach dependencies --> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.4.0</version> </dependency>
  • The only line of code that I am using that is from dependencies above我使用的唯一一行代码来自上面的依赖项

    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协议 = “http”,服务器 = “本地主机”,端口 = 9200,第二端口 = 9201

  • Error错误

在此处输入图像描述

  • Dependencies from IntelliJ来自 IntelliJ 的依赖项

在此处输入图像描述

I know that there is usually problem with dependencies versions, but all are 7.4.0 in this case.我知道依赖版本通常存在问题,但在这种情况下都是7.4.0 Also elasticsearch 7.4.0v is running locally on 3 nodes. elasticsearch 7.4.0v 也在 3 个节点上本地运行。

This project is done on We.Retail project so it is easy to replicate.这个项目是在We.Retail项目上完成的,所以很容易复制。 Also all the code with this error is available here: https://github.com/tadijam64/search-engines-comparison-on-we-retail/tree/elasticsearch-integration AEM 6.4v.此外,所有出现此错误的代码都可以在此处获得: https://github.com/tadijam64/search-engines-comparison-on-we-retail/tree/elasticsearch-integration AEM 6.4v。

Any info or idea is appreciated.任何信息或想法表示赞赏。

UPDATE I tried with adding the following to embed these dependencies externally since they are not OSGi dependencies:更新我尝试添加以下内容以在外部嵌入这些依赖项,因为它们不是 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>

The error remains.错误仍然存在。 I also tried adding it to the "export-package", but nothing helps.我也尝试将它添加到“导出包”中,但没有任何帮助。

And by Elasticsearch documentation , all I need to use Elasticsearch is通过Elasticsearch 文档,我需要使用 Elasticsearch 是

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

but then NoClassDefFoundErrors occurs.但随后发生NoClassDefFoundErrors It seems like a problem with transitive dependencies maybe.这似乎是传递依赖的问题。 Not sure, but any idea is appreciated.不确定,但任何想法都值得赞赏。

Some other suggestions can be found here: https://forums.adobe.com/thread/2653586可以在此处找到其他一些建议: https://forums.adobe.com/thread/2653586

I have also tried adding it's transitive dependencies like org.elasticsearch and org.elasticsearch.client, but it does not work.我还尝试添加它的传递依赖项,例如 org.elasticsearch 和 org.elasticsearch.client,但它不起作用。 The same error, just other class.同样的错误,只是其他 class。

AEM version 6.4, Java version: jdk1.8.0_191.jdk AEM版本6.4,Java版本:jdk1.8.0_191.jdk

So my guess was right, transitive dependencies were not included altho <Embed-Transitive>true</Embed-Transitive> exists.所以我的猜测是正确的,尽管<Embed-Transitive>true</Embed-Transitive>存在,但不包括传递依赖项。

The following is necessary when running elasticsearch as a search engine on AEM the problem:AEM上运行elasticsearch作为搜索引擎时,需要执行以下操作:

  • I have added all transitive dependencies in pom.xml (versions are defined in parent/pom.xml):我在 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>

It is important to add all third-party dependencies as < Embed-Dependency > inside maven-bundle-plugin like this:maven-bundle-plugin中将所有第三方依赖项添加为 < Embed-Dependency > 非常重要,如下所示:

    <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>

Important to notice:需要注意的重要事项:

  • All third-party dependencies (the ones outside of OSGi) must be included in the "Embed-Dependency"所有第三方依赖项(OSGi 之外的)必须包含在“嵌入依赖项”中
  • "Embed-Transitive" must be set to true to include transitive dependencies "Embed-Transitive" 必须设置为 true 才能包含传递依赖项
  • "Import-Package" must include "*;resolution:=optional" to exclude all dependencies that could not be resolved so that the program can run normally "Import-Package" 必须包含"*;resolution:=optional" 以排除所有无法解析的依赖项,以便程序可以正常运行
  • For some reason, there was an error in compile time when "elasticsearch" dependency was added which is not important for this task, so I've decided to ignore it this way:出于某种原因,在添加“elasticsearch”依赖项时编译时出现错误,这对该任务并不重要,所以我决定以这种方式忽略它:
<_fixupmessages>"Classes found in the wrong directory";is:=warning</_fixupmessages>

Though challenging, I finally resolved it.尽管具有挑战性,但我最终解决了它。 There are many similar or the same problems on Google, so I hope this will help someone. Google上有很多类似或相同的问题,所以我希望这会对某人有所帮助。 Thanks to everyone that tried to help.感谢所有试图提供帮助的人。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM