传递依赖性:在AEM中使用Elasticsearch Rest High Client问题 [英] Transitive Dependency: Using Elasticsearch Rest High Client problem in AEM
问题描述
我正在尝试使用
- 来自IntelliJ的依赖项
我知道依赖项版本通常存在问题,但是在这种情况下,所有版本均为 7.4.0 .此外,elasticsearch 7.4.0v还在3个节点上本地运行.
此项目是在 We.Retail 项目上完成的,因此很容易复制.同样,所有包含此错误的代码也可以在此处找到: https://github.com/tadijam64/搜索引擎比较我们/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><配置><说明>< Embed-Dependency> org.apache.servicemix.bundles.solr-solrj,log4j,noggit,zookeeper,elasticsearch-rest-high-client</Embed-Dependency><嵌入-传递> true</嵌入-传递>< Embed-Directory> OSGI-INF/lib</Embed-Directory>< Export-Package> we.retail.core.model *</Export-Package><导入包装>*;分辨率:=可选</导入包>< Private-Package> we.retail.core *</Private-Package>< Sling-Model-Packages>我们零售核心模型</Sling-Model-Packages></说明></configuration></plugin></plugins></build>
错误仍然存在.我还尝试将其添加到导出包"中,但没有任何帮助.
并通过 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.elasticsearch.client,但是它不起作用.同样的错误,只是其他类.
AEM版本6.4,Java版本:jdk1.8.0_191.jdk
所以我的猜测是正确的,在存在< Embed-Transitive> true</Embed-Transitive>
的情况下,不包括传递依赖项
在问题 AEM 上运行 elasticsearch 作为搜索引擎时,需要执行以下操作:
-
我在pom.xml中添加了所有传递依赖项(版本在parent/pom.xml中定义):
<!-Elasticsearch-><依赖关系>< groupId> org.elasticsearch.client</groupId>< artifactId> elasticsearch-rest-high-level-client</artifactId></dependency><依赖关系>< groupId> org.elasticsearch.client</groupId>< artifactId> elasticsearch-rest-client</artifactId></dependency><依赖关系>< groupId> org.elasticsearch</groupId>< artifactId> elasticsearch</artifactId></dependency><依赖关系>< groupId> org.elasticsearch</groupId>< artifactId> elasticsearch-x-content</artifactId></dependency><依赖关系>< groupId> org.elasticsearch.plugin</groupId>< artifactId>等级评估客户端</artifactId></dependency><依赖关系>< groupId> org.apache.commons</groupId>< artifactId> commons-imaging</artifactId>< scope> test</scope></dependency><依赖关系>< groupId> org.elasticsearch.plugin</groupId>< artifactId> lang-mustache-client</artifactId></dependency><依赖关系>< groupId> org.apache.httpcomponents</groupId>< artifactId> httpasyncclient</artifactId></dependency>
重要的是将所有第三方依赖项添加为< 嵌入依赖项>像这样在 maven-bundle-plugin 内部:
< plugin>< groupId> org.apache.felix</groupId>< artifactId> maven-bundle-plugin</artifactId>< extensions> true</extensions><配置><说明>< Embed-Dependency> org.apache.servicemix.bundles.solr-solrj,noggit,elasticsearch-rest-high-level-client,弹性搜索,elasticsearch-rest-client,elasticsearch-x-content,elasticsearch-core,等级评估客户lang-mustache-client,httpasyncclient;</Embed-Dependency><嵌入-传递> true</嵌入-传递>< Embed-Directory> OSGI-INF/lib</Embed-Directory>< Export-Package> we.retail.core.model *</Export-Package><导入包装>*;分辨率:=可选</导入包><私人包装>we.retail.core *</私人包装>< Sling-Model-Packages>我们零售核心模型</Sling-Model-Packages>< _fixupmessages>在错误目录中找到的类"是:=警告</_ fixupmessages></说明></configuration></plugin>
重要提示:
- 所有第三方依赖项(OSGi之外的依赖项)必须包含在嵌入依赖项"中
- 嵌入式传递"必须设置为true才能包含传递依赖项
- 导入包"必须包含"*; resolution:= optional"排除所有无法解决的依赖项,以便程序可以运行通常
- 由于某种原因,当"elasticsearch"被编译时,编译时间有错误.依赖被添加,这并不重要任务,所以我决定以这种方式忽略它:
< _fixupmessages>在错误目录中找到的类";是:= warning</_ fixupmessages>
尽管充满挑战,我终于解决了它.Google上存在许多相似或相同的问题,因此希望对您有所帮助.感谢所有尝试提供帮助的人.
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. Here is the code:
Dependency in the parent pom.xml (the same is defined in 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
- Error
- Dependencies from IntelliJ
I know that there is usually problem with dependencies versions, but all are 7.4.0 in this case. Also elasticsearch 7.4.0v is running locally on 3 nodes.
This project is done on We.Retail project so it is easy to replicate. 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.
Any info or idea is appreciated.
UPDATE I tried with adding the following to embed these dependencies externally since they are not OSGi dependencies:
<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
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.4.0</version>
</dependency>
but then NoClassDefFoundErrors occurs. 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
I have also tried adding it's transitive dependencies like org.elasticsearch and org.elasticsearch.client, but it does not work. The same error, just other class.
AEM version 6.4, Java version: jdk1.8.0_191.jdk
So my guess was right, transitive dependencies were not included altho <Embed-Transitive>true</Embed-Transitive>
exists.
The following is necessary when running elasticsearch as a search engine on AEM the problem:
I have added all transitive dependencies in pom.xml (versions are defined in 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:
<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"
- "Embed-Transitive" must be set to true to include transitive dependencies
- "Import-Package" must include "*;resolution:=optional" to exclude all dependencies that could not be resolved so that the program can run normally
- 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:
<_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. Thanks to everyone that tried to help.
这篇关于传递依赖性:在AEM中使用Elasticsearch Rest High Client问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!