OSGi 应用程序如何在 Java 9 上运行?

How does OSGi application work on Java 9?

我试图了解 OSGi 应用程序在 Java9 中的工作原理,假设 OSGi 包不是 JPMS 模块(据我所知,仍然没有解决方案,OSGi 包可能同时是 JPMS生产模块)。我有几个问题:

  1. 我的理解是否正确,所有 OSGi 应用程序都是一个未命名的模块?
  2. 如果#1 是,那么 Bundle.update() 是如何工作的?包是否重新加载到未命名的模块?

如果理解有误,请说明主要原理。

OSGi 使用 class 加载器来隔离包,并在 Java 9 上继续这样做。由于每个 JAR 都由单独的 class 加载器加载,因此每个 JAR 都以自己的方式结束未命名模块。这意味着 OSGi 有效地忽略了 JPMS 并像以前一样继续工作 Java 9.

Java SE 9 保证所有遵循标准 Java SE 库的应用程序和库的持续兼容性。

OSGi 仅使用已发布的 Java SE API,因此将继续在 Java 9 上保持不变。它目前不与 JPMS 模块交互,这将是您所有的情况其他 Java 软件。在某个时候,OSGi 专家组可能会为 JPMS 模块和 OSGi 包之间的互操作性制定规范,但那是为了将来。

回答您的具体问题:

  1. 是的,OSGi 包将映射到 JPMS 术语中的一个或多个 "unnamed" 模块。同样,这正是 Java 9 为所有其他 Java 应用程序保留向后兼容性的方式。

  2. 捆绑包更新的工作方式与 18 年来的工作方式相同。为捆绑包提供的类加载器已处理,并创建了一个新的类加载器来加载更新 类.