Howto:osgi 和共享包?
Howto: osgi and shared packages?
我正在尝试编写一个应该使用 org.elasticsearch.client.RestHighLevelClient 的 osgi 应用程序。
为此,我添加了包 servicemix.bundles.elasticsearch-client,因为它导出 org.elasticsearch.client 和所需的 RestHighLevelClient。显然,RestHighLevelClient 似乎需要 servicemix.bundles.elasticsearch(以及其他)才能工作,所以我也添加了它 - 两个版本相同。两个包都导出 org.elasticsearch.client 但内容不同。
一切都按预期加载,我可以验证导出的包。
编辑:
我遇到的问题是 org.elasticsearch.client.RestHighLevelClient 的 ClassNotFound 异常。这很奇怪,因为我可以看到 elasticsearch-client 可用并导出所需的包。
我的解释是 Karaf 似乎能够处理共享包。它似乎加载了一个具有所需包的包来满足我的应用程序功能的要求,然后决定它就足够了,即使所需的 class 实际上存在于另一个包中。
在@ChristianSchneider 发表评论并获得更多理解后,我更新了我的配置。但是,问题依然存在。
我现在有一个 elastisearch-client6-feature 和一个 elasticsearch6-feature
<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,因为它们都是必需的。
亲切的问候
吉恩克斯
我遇到了同样的问题,这就是我所做的...
- 转到 https://jar-download.com/artifacts/org.elasticsearch.client/elasticsearch-rest-high-level-client/all-versions 这是一个可以让您下载 Maven 工件及其所有依赖项的站点,select 您想要的版本。
- 在 select 下载版本后,单击红色下载按钮,它将下载一个包含所有弹性搜索 jar 的 zip 文件,需要 dependencies.After 下载并在本地文件系统上解压缩 jar。
- 像 com.mycompany.thirdparty.elasticsearch
这样创建一个包
- 在包的根目录中创建一个 lib 文件夹,然后 copy/paste 您从下载中解压缩到该文件夹中的所有那些 jar。
- 使用 eclipse MANIFEST 编辑器转到运行时选项卡,在 class 路径部分添加 lib 文件夹中的所有 jar。然后对于导出的包单击添加并添加所有可用的包。
这将创建一个包含弹性搜索及其所有依赖项的捆绑包,这些依赖项将导出到导入弹性搜索包或将捆绑包添加为依赖项的其他捆绑包。
希望这能让您朝着正确的方向前进,在 eclipse 中使用 MANIFEST 编辑器最容易做到这一点,因为它会自动更新 build.properties 文件。
我正在尝试编写一个应该使用 org.elasticsearch.client.RestHighLevelClient 的 osgi 应用程序。 为此,我添加了包 servicemix.bundles.elasticsearch-client,因为它导出 org.elasticsearch.client 和所需的 RestHighLevelClient。显然,RestHighLevelClient 似乎需要 servicemix.bundles.elasticsearch(以及其他)才能工作,所以我也添加了它 - 两个版本相同。两个包都导出 org.elasticsearch.client 但内容不同。 一切都按预期加载,我可以验证导出的包。
编辑: 我遇到的问题是 org.elasticsearch.client.RestHighLevelClient 的 ClassNotFound 异常。这很奇怪,因为我可以看到 elasticsearch-client 可用并导出所需的包。
我的解释是 Karaf 似乎能够处理共享包。它似乎加载了一个具有所需包的包来满足我的应用程序功能的要求,然后决定它就足够了,即使所需的 class 实际上存在于另一个包中。
在@ChristianSchneider 发表评论并获得更多理解后,我更新了我的配置。但是,问题依然存在。
我现在有一个 elastisearch-client6-feature 和一个 elasticsearch6-feature
<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,因为它们都是必需的。
亲切的问候 吉恩克斯
我遇到了同样的问题,这就是我所做的...
- 转到 https://jar-download.com/artifacts/org.elasticsearch.client/elasticsearch-rest-high-level-client/all-versions 这是一个可以让您下载 Maven 工件及其所有依赖项的站点,select 您想要的版本。
- 在 select 下载版本后,单击红色下载按钮,它将下载一个包含所有弹性搜索 jar 的 zip 文件,需要 dependencies.After 下载并在本地文件系统上解压缩 jar。
- 像 com.mycompany.thirdparty.elasticsearch 这样创建一个包
- 在包的根目录中创建一个 lib 文件夹,然后 copy/paste 您从下载中解压缩到该文件夹中的所有那些 jar。
- 使用 eclipse MANIFEST 编辑器转到运行时选项卡,在 class 路径部分添加 lib 文件夹中的所有 jar。然后对于导出的包单击添加并添加所有可用的包。
这将创建一个包含弹性搜索及其所有依赖项的捆绑包,这些依赖项将导出到导入弹性搜索包或将捆绑包添加为依赖项的其他捆绑包。
希望这能让您朝着正确的方向前进,在 eclipse 中使用 MANIFEST 编辑器最容易做到这一点,因为它会自动更新 build.properties 文件。