问题标签 [embedded-osgi]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
elasticsearch - java.util.ServiceConfigurationError 使用 OSGi 包时提供程序不是子类型
我正在创建一个 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 文件,以检查导入的内容。
激活捆绑包时,会引发异常:
XContentBuilderExtension 来自 elasticsearch-x-content-6.5.0.jar,XContentElasticsearchExtension 类包含在 elasticsearch-6.5.0.jar 中。两者都是包含的资源,并已放在类路径中。
激活方法在我的另一个 jar 中初始化一个 TransportClient,因此它发生在激活时;)。
编辑:
我注意到第一次安装此错误或门户重新启动时不会发生此错误。所以它只发生在我卸载并重新安装捆绑包时。(这是我非常喜欢的功能!)。也许是一个愚蠢的想法。但会不会有一些“悬线”?捆绑包没有正确安装,或者 TransportClient 仍然存在?我正在检查这个。欢迎任何提示!
编辑2:
我担心这是SPI和OSGi之间的不兼容?我已经检查过:High Level Rest Client 也有同样的问题。(但随后有另一个扩展名)。我将尝试使用 Low-Level Rest Client。这应该可行,因为我猜依赖最少。我仍然很好奇为什么存在不兼容。我当然不是 OSGi 方面的专家,也不是 SPI 方面的专家。(是时候学习新东西了!)
osgi - 系统捆绑包如何访问系统包?
在过去的几周里,我正在探索 OSGI 是如何实现的。我知道每个包都使用自己的类加载器来加载它的类。作为我调查的一部分,我了解到每个包的类加载器的父级都是空的,即引导类加载器。
捆绑样本包中的上述代码的输出是
对于包中的导入,它维护一个 packagename=>classloader 的映射,以便它可以将请求委托给正确的类加载器
上述代码的输出是
正如您在上面输出的第一行中看到的,包com.test.packag添加为FelixConstants.FRAMEWORK_SYSTEMPACKAGES并且包 samplebundle 连接到com.test.packag的系统包 [0]。
因此,我想了解 system bundle[0] 如何访问由不同类加载器(App 类加载器)加载的系统包。不仅如此 OSGI 的所有核心类如 Bundle、BundleActivator、Felix 也由 App 类加载器加载。因此,我尝试调试 Felix 代码以了解系统捆绑包是否将 loadClass() 请求委托给 App 类加载器。不幸的是,在调试时我观察到 BundleWiringImpl 类的 m_wiring 变量,我注意到系统包的类加载器为空(这是不可能的,因为引导类加载器只加载 java.* 包)。
如果我错了,请纠正我的理解。
我的问题是
system_bundle[0] 的类加载器是什么,它的父类加载器是什么?
如果 system_bundle 类加载器的父类不是 App 类加载器,系统捆绑包是否还维护 package=>classloader 的映射以加载由应用类加载器加载的类?
类加载器(捆绑类加载器、系统类加载器、引导类加载器和应用程序类加载器)的层次结构到底是什么?
谢谢你。
java - 嵌入 javassist 依赖会破坏 OSGi 包
我正在尝试嵌入式 Felix 场景。从嵌入式 OSGi 容器 (Apache Felix) 加载包时,我收到以下错误。
经过反复试验,我发现引入javassist
会导致错误。
我正在尝试嵌入依赖项。
关于我收到此错误的原因有什么建议吗?