如何将特定的 java 模块嵌入到 OSGi 包中?甚至可能吗?

Posted

技术标签:

【中文标题】如何将特定的 java 模块嵌入到 OSGi 包中?甚至可能吗?【英文标题】:How to embed specific java modules into OSGi bundles? Is it even possible? 【发布时间】:2021-11-09 05:35:00 【问题描述】:

使用 java 11+、Eclipse、OSGi:

所以,我在 java 中有一个“主”模块。基本上,可以认为是主要的应用程序模块。从这个模块我动态访问一个 OSGi 实现。 (现在,Apache felix,但它真的不重要,我不认为。)然后我可以通过该主应用程序安装/使用 OSGi 包,如果设置了正确的导入/导出,则调用包之间的类。没问题。

我的应用程序模块嵌入了 java.desktop 和 java.xml 模块。因此,我安装的所有包都可以访问这些模块中的类(Swing、org.w3c.dom 等)——而且它可以工作。

现在,如果我想从新包中访问 java 模块(例如 java.sql)的代码,但我的主模块中没有嵌入该模块 (java.sql),该怎么办?这个新包如何访问 java.sql 代码?

基本上,每次我尝试调用我没有首先嵌入到主模块中的模块代码时,我都会收到一个找不到类的错误。通过运行配置,我可以设置我的主模块以嵌入这些模块:java.desktop、java.xml、java.sql 或任何其他模块(通过模块信息文件中的“requires”语句。我如何访问新的(在运行时从后来动态安装的 osgi 包中获取非当前嵌入的)模块?

是否有某种 bundle-config 可以在 bundle 中嵌入特定的 java 模块,类似于 module-info 中的 require 语句?

我是否必须通过某种服务访问来动态调用这些新模块?

非常感谢。

【问题讨论】:

与使用模块路径的Java Platform Module System (JPMS) 相比,在使用自己的类加载器的 OSGi 中,捆绑软件具有版本,可以在运行时安装、启动、停止和卸载。这就是您不能将 JPMS 模块用作 OSGi 包的原因。您使用过 JPMS 或 OSGi。 【参考方案1】:

查看实现 OSGi Connect 的 OSGi Connect Specification 和 Apache Felix Atomos 项目。

OSGi Connect 为 JPMS 模块和 OSGi 包的混合环境定义了交互机制。

【讨论】:

非常感谢您的反馈,Hargrave 先生。这很可能是“答案”。不幸的是,我认为 java+jpms+osgi 再复杂不过了。显然,我错了。 sigh 我希望有一天 jpms 会吸收 osgi 的功能,因此对于真正的动态模块只有一层可以处理。但这只是一个梦想,不是吗。

以上是关于如何将特定的 java 模块嵌入到 OSGi 包中?甚至可能吗?的主要内容,如果未能解决你的问题,请参考以下文章

OSGi:导出一个包而不导出同一个包中的几个类

OSGi + 休眠

OSGI容器中func的集成测试

如何使用 bnd/maven-bundle-plugin 从 jar 依赖项将资源文件包含到 osgi 包中?

如何将自定义 osgi 包添加为新依赖项?

带有 maven-bundle-plugin 的 OSGI JAR 包