【发布时间】:2019-06-28 04:15:30
【问题描述】:
我正在创建一个 Liferay 7.1 OSGi 包,其中包含一些外部依赖项。考虑到时间,我们选择将外部 JAR 嵌入到我们的 OSGi Bundle 中。我设法创建了一个 bnd 文件,其中包含所有 ElasticSearch 依赖项,并将它们放在包类路径中。我使用了来自 github (https://github.com/liferay/liferay-portal/blob/master/modules/apps/portal-search-elasticsearch6/portal-search-elasticsearch6-impl/build.gradle) 的源代码和 bnd.bnd 文件来检查导入的内容。
激活捆绑包时,抛出异常:
The activate method has thrown an exception
java.util.ServiceConfigurationError: org.elasticsearch.common.xcontent.XContentBuilderExtension: Provider org.elasticsearch.common.xcontent.XContentElasticsearchExtension not a subtype
at java.util.ServiceLoader.fail(ServiceLoader.java:239)
at java.util.ServiceLoader.access$300(ServiceLoader.java:185)
at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:376)
at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
at java.util.ServiceLoader$1.next(ServiceLoader.java:480)
at org.elasticsearch.common.xcontent.XContentBuilder.<clinit>(XContentBuilder.java:118)
at org.elasticsearch.common.settings.Setting.arrayToParsableString(Setting.java:1257)
XContentBuilderExtension 来自 elasticsearch-x-content-6.5.0.jar, XContentElasticsearchExtension 类包含在 elasticsearch-6.5.0.jar 中。两者都是包含的资源,并已放在类路径中。
Activate 方法在我的另一个 jar 中初始化一个 TransportClient,因此它发生在激活时;)。
编辑:
我注意到第一次安装此错误或门户重新启动时不会发生此错误。所以它只发生在我卸载并重新安装捆绑包时。 (这是我非常喜欢的功能!)。也许是一个愚蠢的想法。但会不会有一些“悬线”?捆绑包没有正确安装,或者 TransportClient 仍然存在?我正在检查这个。欢迎任何提示!
编辑 2:
我担心这是 SPI 和 OSGi 之间的不兼容?我已经检查过:High Level Rest Client 也有同样的问题。 (但随后有另一个扩展名)。我将尝试使用 Low-Level Rest Client。这应该可行,因为我猜依赖最少。我仍然很好奇为什么存在不兼容。我当然不是 OSGi 方面的专家,也不是 SPI 方面的专家。 (是时候学习新东西了!)
【问题讨论】:
-
问题:为什么要将代码嵌入到自己的包中,而这些包已经在 liferay 中可用?见i.imgur.com/Rra4dAa.png
-
因为我的外部依赖本机使用 ElasticSearch。 Liferay 不导出弹性包。弹性包不能通过 OSGi 获得。但如果我错了,请纠正我。 :)
-
我不是 osgi 大师,但是为什么不使用现有的 portal-search-elasticsearch6-impl 包,复制一份,更改 bdn.bdn 并导出你想要的,给它一个新版本并部署 jar...?
-
嗯,这正是我不愿意做的。触摸 Liferay 的内部包来修复我的。这真的是非常糟糕的做法,我建议你永远不要这样做。在您的情况下,无论何时更新捆绑包,您都应该手动更新类。除了 Elastic Dependency 之外,我们的 bundle 与现有的 portal-search-elasticsearch6-impl 有 0 个相似之处。OSGi 的全部意义在于 bundle 有自己的类路径,甚至可以部署多个版本的相同的依赖。我不会为自己滥用现有的捆绑包......
-
好的,Kornelito,很清楚
标签: elasticsearch liferay osgi osgi-bundle embedded-osgi