【问题标题】:How does OSGi application work on Java 9?OSGi 应用程序如何在 Java 9 上运行?
【发布时间】:2018-02-26 01:23:32
【问题描述】:

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

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

如果我理解错了,请解释主要原则。

【问题讨论】:

    标签: java osgi java-9


    【解决方案1】:

    OSGi 使用类加载器来隔离捆绑包,并在 Java 9 上继续这样做。由于每个 JAR 都由单独的类加载器加载,因此每个 JAR 最终都在其自己的未命名模块中。这意味着 OSGi 有效地忽略了 JPMS 并继续像 Java 9 之前一样工作。

    【讨论】:

      【解决方案2】:

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

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

      回答您的具体问题:

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

      2. Bundle 更新的工作方式与 18 年来的工作方式相同。为包提供的类加载器被释放,并创建一个新的类加载器来加载更新类。

      【讨论】:

      • 仅供参考,JSR 376 中的 JPMS 提案明确承认了 OSGi 的价值,并表明它打算让 OSGi 继续在 Java 9 下工作。引用第 2.5 节:OSGi 的生命周期和动态服务注册工具对某些复杂的应用程序很有用,但超出了上述需求的范围。那些需要这些设施的人仍然可以在 Java SE 9 实现之上运行 OSGi。
      猜你喜欢
      • 1970-01-01
      • 2011-03-04
      • 1970-01-01
      • 1970-01-01
      • 2020-11-05
      • 1970-01-01
      • 2013-05-07
      • 1970-01-01
      • 2018-03-16
      相关资源
      最近更新 更多