【发布时间】:2018-02-26 01:23:32
【问题描述】:
我试图了解 OSGi 应用程序在 Java 9 中是如何工作的,假设 OSGi 包不是 JPMS 模块(据我所知,仍然没有解决方案可以让 OSGi 包同时是用于生产的 JPMS 模块)。我有几个问题:
- 我是否理解所有 OSGi 应用程序都是一个未命名的模块?
- 如果#1 是,那么
Bundle.update()是如何工作的?捆绑包是否重新加载到未命名的模块?
如果我理解错了,请解释主要原则。
【问题讨论】:
我试图了解 OSGi 应用程序在 Java 9 中是如何工作的,假设 OSGi 包不是 JPMS 模块(据我所知,仍然没有解决方案可以让 OSGi 包同时是用于生产的 JPMS 模块)。我有几个问题:
Bundle.update() 是如何工作的?捆绑包是否重新加载到未命名的模块?如果我理解错了,请解释主要原则。
【问题讨论】:
OSGi 使用类加载器来隔离捆绑包,并在 Java 9 上继续这样做。由于每个 JAR 都由单独的类加载器加载,因此每个 JAR 最终都在其自己的未命名模块中。这意味着 OSGi 有效地忽略了 JPMS 并继续像 Java 9 之前一样工作。
【讨论】:
Java SE 9 保证与标准 Java SE 库的所有应用程序和库的持续兼容性。
OSGi 仅使用已发布的 Java SE API,因此将继续在 Java 9 上保持不变。它目前不与 JPMS 模块进行交互,所有其他 Java 软件都是如此。在某个时候,OSGi 专家组可能会为 JPMS 模块和 OSGi 捆绑包之间的互操作性制定规范,但那是未来的事情。
回答您的具体问题:
是的,OSGi 包将映射到一个或多个 JPMS 术语中的“未命名”模块。同样,这正是 Java 9 为所有其他 Java 应用程序保持向后兼容性的方式。
Bundle 更新的工作方式与 18 年来的工作方式相同。为包提供的类加载器被释放,并创建一个新的类加载器来加载更新类。
【讨论】: