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

Pav*_*l_K 14 java osgi java-9

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

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

如果我理解错误,请解释主要原则.

Nei*_*ett 19

Java SE 9保证了所有符合标准Java SE库的应用程序和库的持续兼容性.

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

回答您的具体问题:

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

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

  • 仅供参考,[JSR 376](https://www.jcp.org/en/jsr/detail?id=376)中的JPMS提案明确承认OSGi的价值,并表示其打算让OSGi继续在Java下工作9.引用第2.5节:*OSGi的生命周期和动态服务注册工具对某些复杂的应用程序很有用,但超出了上述需求的范围.那些需要这些工具的人仍然可以在Java SE 9实现的基础上运行OSGi.* (5认同)

Nic*_*lai 8

OSGi使用类加载器来隔离bundle,并继续在Java 9上执行此操作.由于每个JAR都由一个单独的类加载器加载,每个JAR都以其自己的未命名模块结束.这意味着OSGi实际上忽略了JPMS并继续像Java 9一样工作.