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

How to embed specific java modules into OSGi bundles? Is it even possible?

使用 java 11+、Eclipse、OSGi:

所以,我在 java 中有一个“主”模块。基本上可以认为是主要的app模块。我从这个模块动态访问 OSGi 实现。 (现在,Apache felix,但它真的不重要,我不认为。)然后我可以 install/use OSGi 捆绑通过那个主应用程序,并在捆绑之间调用 classes 如果正确的 imports/exports 已设置。没问题。

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

现在,如果我想从一个 java 模块访问代码,比如说 java.sql,从一个新的包中,但是我没有那个模块 (java.sql)嵌入到我的主模块中?那个新包如何访问 java.sql 代码?

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

是否有某种 bundle-config 可以将特定的 java 模块嵌入到一个 bundle 中,类似于模块信息中的 require 语句?

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

非常感谢。

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

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