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