【问题标题】:Howto: osgi and shared packages?Howto:osgi 和共享包?
【发布时间】:2025-12-10 19:05:01
【问题描述】:

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

编辑: 我遇到的问题是 org.elasticsearch.client.RestHighLevelClient 的 ClassNotFound 异常。这很奇怪,因为我可以看到 elasticsearch-client 可用并导出所需的包。

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

在来自@ChristianSchneider 的 cmets 并获得更多了解之后,我更新了我的配置。但是,问题仍然存在。

我现在有一个 elastisearch-client6-feature 和一个 elasticsearch6-feature

mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.elasticsearch/6.3.2_1mvn:com.fasterxml.jackson.dataformat/jackson-dataformat-cbor/2.9.6mvn:com.fasterxml.jackson.core/jackson-core/2.9.6wrap:mvn:com.vividsolutions/jts/1.13wrap:mvn:io.sgr/s2-geometry-library-java/1.0.0捆绑> wrap:mvn:org.locationtech.jts/jts-core/1.15.1功能> mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.elasticsearch-client/6.3.2_1功能>

和我的应用程序功能

mvn:com.mycompany/application-feature/${version}功能>

有人可以建议我如何强制我的应用程序功能同时加载 elasticsearch-client6-feature 和 elasticesearch6,因为它们都是必需的。

亲切的问候 吉恩克斯

【问题讨论】:

  • 为什么要包装这些捆绑包? servicemix 包应该已经提供了必要的 OSGi 元数据。如果你只是加载捆绑包会发生什么?如果是同样的问题,那么我认为这是 servicemix 捆绑包中的错误。
  • 感谢@ChristianSchneider 的回复。我已经更新了原始问题。如果您有更多意见,我们将不胜感激。
  • 看起来已经好多了。现在你为什么要包装你的包。在您的构建中,您应该生成一个有效的捆绑包。您覆盖 Import-Package 的方式会导致 org.elasticsearch.action 的导入丢失。你还应该为你自己的包移除dependency=true。
  • @ChristianSchneider 我包装它是因为我还没有让我自己的源代码符合 osgi 标准。导入是因为实际上有旧版本的弹性搜索客户端,至少在有限的时间内,必须与我的新包共存。依赖=真如何工作?我是否真的需要指定我的源需要elasticsearch,而实际上它是elasticsearch-client 所需的瞬态依赖?如前所述,my-elastic-feature 抱怨它无法从 elasticsearch 中找到 ActionRequest,即使我的源代码中没有引用它。
  • dependency=true 意味着:只有在另一个包需要时才安装一个包。如果有多个候选者,这允许 karaf 选择最佳捆绑包。你自己的包通常不应该使用这个。

标签: java rest elasticsearch osgi karaf


【解决方案1】:

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

  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 编辑器转到运行时选项卡,在类路径部分添加 lib 文件夹中的所有 jar。然后对于导出的包单击添加并添加所有可用的包。

这将创建一个包含弹性搜索及其所有依赖项的包,这些包被导出到导入弹性搜索包或将包添加为依赖项的其他包。

希望这能让您找到正确的方向,在 Eclipse 中使用 MANIFEST 编辑器最容易做到这一点,因为它会自动更新 build.properties 文件。

【讨论】:

  • 感谢邓肯的回复。我可能会尝试一下——我运行的是 IntelliJ 而不是 eclipse,但我希望它也是可行的。直接在maven中。鉴于我的问题的更新 - 你仍然认为它是一个解决方案吗?
  • 老实说,我认为解决方案是 jar-download.com 站点,它可以让您搜索 maven 工件,只需获取 ES 客户端及其依赖项,然后弄清楚如何将它们全部打包。跨度>
  • OSGI 和 maven 之间存在不匹配,这是一种痛苦,像 Tycho 这样的解决方案只能部分解决问题,有时它只是更容易将 jar 包装成你需要的包。