【发布时间】: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
和我的应用程序功能
有人可以建议我如何强制我的应用程序功能同时加载 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