当前位置: 首页 > 知识库问答 >
问题:

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

漆雕奇逸
2023-03-14

我尝试在Adobe Experience Manager中使用Java高级Rest客户端完成Lucene、Solr和Elasticsearch搜索引擎的比较项目。

我对elasticsearh的实现有一些问题。代码如下:

> 父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);
    }
    

    协议=“HTTP”,服务器=“localhost”,端口=9200,第二端口=9201

    • 错误

    • 来自Intellij
    • 的依赖项

    我知道依赖版本通常有问题,但在这种情况下,所有的依赖版本都是7.4.0。此外,elasticsearch 7.4.0v也在3个节点上本地运行。

    这个项目是在We.Retail项目上完成的,所以很容易复制。此外,出现此错误的所有代码可在以下网址获得:https://github.com/tadijam64/search-engines-comparis-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>
    

    错误仍然存在。我也试着把它添加到“export-package”中,但没有任何帮助。

    根据Elasticsearch文档,我使用Elasticsearch所需要的就是

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

    但随后发生NoClassDefounderRors。这似乎是传递依赖的问题。不确定,但任何想法都值得赞赏。

    其他一些建议可以在这里找到:https://forums.adobe.com/thread/2653586

    我也尝试过添加它的可传递依赖项,比如org.elasticsearch和org.elasticsearch.client,但都不起作用。同样的错误,只是其他类。

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

  • 共有1个答案

    顾宸
    2023-03-14

    所以我的猜测是对的,虽然 true 存在,但传递依赖项并不包括在内。

    当在AEM问题上运行elasticsearch作为搜索引擎时,以下内容是必需的:

    >

  • 我已在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>
    

    将所有第三方依赖项作为 添加到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-transitive”必须设置为true,以包括可传递依赖项
    • “import-package”必须包括“*;resolution:=optional”,以排除所有无法解析的依赖项,从而使程序能够正常运行
    • 由于某种原因,当添加“elasticsearch”依赖项时,在编译时出现错误,而该依赖项对此任务并不重要,因此我决定以以下方式忽略它:
    <_fixupmessages>"Classes found in the wrong directory";is:=warning</_fixupmessages>
    

    虽然很有挑战性,但我最终还是解决了。谷歌上有很多类似或相同的问题,所以我希望这会对某人有所帮助。感谢每一个试图帮忙的人。

  •  类似资料:
    • 我正在使用Spring Boot 1.4.0和Spring-Cloud-scuth,这里是我的pom: 这是我的依赖关系树: 看起来SpringBootSleuth已经覆盖了依赖项,因为SpringBoot1.4使用Spring4.3。2.释放。我不需要它,如何避免这种行为??

    • 在应用中,您希望使用不同的类来处理不同的任务以保持代码的简洁。我们把这些类称为 依赖。如何将这些依赖关系传递给将在后台任务调用的方法呢? 当您在后台任务中调用静态方法时,仅限于应用程序的静态上下文,这需要您使用以下获取依赖关系的模式: 通过 new 手动实例化依赖 服务定位器模式 抽象工厂模式 或 建设者模式 单例模式 然而,所有这些模式使您的应用程序的单元可测试性方面变得非常复杂。为了解决这个问

    • 主要内容:依赖传递,依赖范围,依赖范围对传递依赖的影响,依赖调节Maven 依赖传递是 Maven 的核心机制之一,它能够一定程度上简化 Maven 的依赖配置。本节我们将详细介绍依赖传递及其相关概念。 依赖传递 如下图所示,项目 A 依赖于项目 B,B 又依赖于项目 C,此时 B 是 A 的直接依赖,C 是 A 的间接依赖。 Maven 的依赖传递机制是指:不管 Maven 项目存在多少间接依赖,POM 中都只需要定义其直接依赖,不必定义任何间接依赖,Mav

    • 本文向大家介绍DBMS中的传递依赖,包括了DBMS中的传递依赖的使用技巧和注意事项,需要的朋友参考一下 什么是传递依存关系 当间接关系引起功能依赖性时,称为传递依赖性。 如果P-> Q且Q-> R为真,则P-> R为传递依赖。 要实现3NF,请消除传递依赖性。 示例 <电影列表> Movie_ID Listing_ID Listing_Type DVD_价格($) M08 L09 犯罪 180 M

    • 我在Liferay DXP中为Google Analytics API编写了代码。我已经通过在build.gradle中编写来导入了以下jar 此外,我还使用以下代码将其包含在bnd.bnd文件中: 该模块编译良好,我能够得到JAR。但是当我在服务器上部署这个jar时,我总是得到未解决的需求:import-package:error。 我知道问题出在传递依赖上。我在Liferay社区的某个地方读到

    • 这是我的第一个问题。我必须使用ES rest高级客户端。我的ES服务器是6.8。x、 所以我写了我的构建。gradle文件。 但我的项目依赖性如下所示。 Gradle:org.elasticsearch.client:elasticsearch ch-rest-客户端:7.6.2 Gradle:org.elasticsearch.client:elasticsearch ch-rest-高级别-客