如何:osgi和共享软件包?

时间:2018-08-10 16:34:54

标签: java rest elasticsearch osgi karaf

我正在尝试编写一个osgi应用程序,该应用程序应使用org.elasticsearch.client.RestHighLevelClient。 为此,我添加了包servicemix.bundles.elasticsearch-client,因为它导出了 org.elasticsearch.client 和所需的 RestHighLevelClient 。不过,显然, RestHighLevelClient 需要servicemix.bundles.elasticsearch(以及其他功能)才能正常工作,所以我还要添加它-两个版本都相同。这两个捆绑软件均导出 org.elasticsearch.client ,但内容不同。 一切都按预期加载,我可以验证导出的软件包。

编辑: 这个问题让我自己重新感到自己是 org.elasticsearch.client.RestHighLevelClient 的ClassNotFound例外。这很奇怪,因为我可以看到elasticsearch-client可用并导出所需的包。

我的解释是,Karaf确实能够处理共享软件包。它似乎加载了具有所需程序包的捆绑软件之一,以满足我的应用程序功能的要求,然后,即使所需的类实际上存在于另一个捆绑软件中,也决定它足够了。

在@ChristianSchneider发表评论并获得更多了解之后,我更新了我的配置。但是,问题仍然存在。

我现在具有elastisearch-client6-功能和elasticsearch6-功能

   
    <feature name="elasticsearch6" version="6.3.2" description="Elasticsearch Base libraries">
        <bundle start-level="80">mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.elasticsearch/6.3.2_1</bundle>
        <bundle dependency="true">mvn:com.fasterxml.jackson.dataformat/jackson-dataformat-cbor/2.9.6</bundle>
        <bundle dependency="true">mvn:com.fasterxml.jackson.core/jackson-core/2.9.6</bundle>
        <bundle dependency="true">wrap:mvn:com.vividsolutions/jts/1.13</bundle>
        <bundle dependency="true">wrap:mvn:io.sgr/s2-geometry-library-java/1.0.0</bundle>
        <bundle dependency="true"><![CDATA[wrap:mvn:io.netty/netty-all/4.1.28.Final$Bundle-Version=4.1.28&Export-Package=*;version=4.1.28]]></bundle>
        <bundle dependency="true">wrap:mvn:org.locationtech.jts/jts-core/1.15.1</bundle>
    </feature>

    <feature name="elasticsearch-client6" version="6.3.2" description="Elasticsearch Client libraries">
        <bundle start-level="80">mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.elasticsearch-client/6.3.2_1</bundle>
    </feature>

和我的应用程序功能

    <feature name="my-application" version="${version}">
        <bundle start-level="92">mvn:com.mycompany/application-feature/${version}</bundle>
    </feature>

请问有人可以建议我如何强制我的应用程序功能同时加载elasticsearch-client6-feature和elasticesearch6。

亲切的问候 Jiinx

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,这就是我所做的...

  1. 转到https://jar-download.com/artifacts/org.elasticsearch.client/elasticsearch-rest-high-level-client/all-versions,该站点可让您下载Maven工件及其所有依赖项,并选择所需的版本。
  2. 选择版本后,单击红色下载按钮,它将下载包含所有弹性搜索jar和所需依赖项的zip文件。下载后,将jar解压缩到本地文件系统上。
  3. 创建一个包,如com.mycompany.thirdparty.elasticsearch
  4. 在分发包的根目录中创建一个lib文件夹,然后将所有从下载中解压缩的jar文件复制/粘贴到该文件夹​​中。
  5. 使用eclipse MANIFEST编辑器转到“运行时选项卡”,在“类路径”部分中,将所有jar都添加到lib文件夹中。然后对于导出的软件包,单击添加并添加所有可用的软件包。

这将创建一个具有弹性搜索及其所有依赖项的捆绑软件,这些捆绑软件将导出到导入弹性搜索包或将该捆绑软件添加为依赖项的其他捆绑软件中。

希望能为您提供正确的方向,最容易在MANIFEST编辑器中实现,因为它会自动更新build.properties文件。