Java 8 模块与 OSGi 有何不同?

Java 8 和 Project Jigsaw 为 SDK 带来了一个模块系统。我认为这是一件好事,因为它是软件包(内置)的一部分。OSGi还提供模块系统,但需要容器。但除此之外,它们之间的主要区别是什么。

如果我使用 OSGi,我是否能够使用标准 JDK 8 发行版运行它?

当默认 SDK 包含此类功能时,OSGi 是否相关?我的理解是,OSGi和Jigsaw都可以用来编写普通的模块化Java应用程序,而不仅仅是基于serve的应用程序(servlet等),对吧?

对OSGi,Java Modularity和Jigsaw的问题的答案表明Jigsaw模块系统对于JRE可能是必要的。通过JRE,我假设OP意味着用Java编写的Java标准库,如IO,CORBA,RMI,或者它是作为目标的类库实现的基础?通过阅读Jigsaw项目页面,我认为是前者。如果是后者,它如何帮助其他编写Java代码的Java开发人员?类库是用 C/C++ 编写的。任何人都可以澄清一下吗?

这不是OSGi与Jigsaw。我想真正了解要使用哪一个。如果我要编写一个新的应用程序(无论是桌面还是服务器),我希望基于可能不会被标准实现淘汰并放弃软件的技术。我不是说OSGi已经过时了,我喜欢OSGi。我正在着眼于大局,OSGi本身的未来方向是什么。


答案 1

正如评论中已经写的那样,Java 8不会附带Jigsaw。也许是Java 9。

此外,在JavaOne 2013上,我参加了Mark Reinhold的一次演讲,听起来Jigsaw的发展方式通常对Java开发人员并不开放,即JRE将使用Jigsaw来模块化JRE(阅读:rt.jar)本身,但它不应该被Java开发人员使用。给出的原因之一是Jigsaw不应该与Maven,OSGi等现有解决方案竞争。另一个原因是关闭对 sun.* 内部软件包的访问。

但那天晚些时候,我也从参加BOF的人那里听说,社区要求为Java开发人员打开Jigsaw,但我没有听到任何更新。

无论如何,OSGi应该可以与Jigsaw一起运行良好。但是,如果许多库继续使用旧的 sun.* 包或其他内部 JRE 代码,它们将在 Java 9 上中断。

2015 年 3 月更新

在 EclipseCon 2015 上,Mark Reinhold 发表了一场主题演讲,介绍了 Java 9 的更新。Java 9将包括一个Java模块系统。它适用于 JRE/JDK,也可供任何想要使用它的 Java 应用程序使用。但是,范围发生了一些变化。

主要区别(截至2015年3月)是:

  • 类装入器 - 拼图不会使用类装入器;由运行时(如应用程序服务器或OSGi)来使用模块和类装入器
  • 依赖关系 - Jigsaw将允许按名称指定对模块的依赖关系,但不允许在包级别指定
  • 动态服务 - OSGi 提供的运行时服务模型不会由 Jigsaw 提供

Jigsaw不打算取代和/或与任何其他运行时或构建时模块系统(如OSGi或Maven)竞争。事实上,Jigsaw的意图是(以某种方式)与两者互操作。


答案 2

推荐