Java 8 模块与 OSGi 有何不同?

Posted

技术标签:

【中文标题】Java 8 模块与 OSGi 有何不同?【英文标题】:How is Java 8 modules different from OSGi? 【发布时间】:2014-01-05 06:21:12 【问题描述】:

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

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

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

对OSGi, Java Modularity and Jigsaw 问题的回答表明JRE 可能需要Jigsaw 模块系统。通过 JRE,我假​​设 OP 是指用 Java 编写的 Java 标准库,如 IO、CORBA、RMI,还是作为目标的类库实现?通过阅读 Jigsaw 项目页面,我认为是前者。如果是后者,它如何帮助其他编写 Java 代码的 Java 开发人员?类库是用 C/C++ 编写的。有人可以澄清一下吗?

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

【问题讨论】:

如果您正在计划一个项目,请注意来自JDK 8 public review 的声明:本规范的原始请求建议包含一个模块系统,并使用该系统将平台本身。然而,该功能被推迟到未来的版本中,以便有足够的时间进行广泛的评估、审查和反馈,这是对平台进行如此深刻的改变所需要的。 是的。 Jigsaw 已脱离 Java 8。此外,Jigsaw 项目将重新考虑其目标和要求,mail.openjdk.java.net/pipermail/jigsaw-dev/2013-August/…,并可能成为 Java 9 的一部分。所以这意味着我们不知道 Jigsaw 将是什么,也不知道它何时会出现爪哇。所以很难与现在的 OSGi 进行比较。 还要注意有Penrose项目:openjdk.java.net/projects/penrose“这个项目的目标是探索和实现Jigsaw项目和OSGi之间的互操作性。” 【参考方案1】:

正如 cmets 中已经写的那样,Jigsaw 不会附带 Java 8。也许是 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 月更新

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

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

类加载器 - Jigsaw 不会使用类加载器;使用模块和类加载器取决于运行时(例如应用程序服务器或 OSGi) 依赖项 - Jigsaw 将允许通过名称指定对模块的依赖项,但不能在包级别指定依赖项 动态服务 - Jigsaw 不会提供 OSGi 提供的运行时服务模型

Jigsaw 并非旨在替换和/或与任何其他运行时或构建时模块系统(例如 OSGi 或 Maven)竞争。事实上,Jigsaw 的意图是(以某种方式)与两者互操作。

【讨论】:

刚从 Java 7 之前的一篇关于 Jigsaw 的文章中找到了一篇关于 Jigsaw 的文章,并认为它对于我正在编写的一些代码来说是多么完美,并认为它肯定是在 Java 8 中......不。 面向未来的 Java 版本 10,11 甚至 111 用户。你已经有拼图了吗?毕竟,在它到来之前,我可能必须过上健康的生活。 现在 Java 9/Jigsaw 已经发布:上面提供的 2015 年的描述是否仍然有效? 如我所见,截至 Java 11/12 仍然有效。一些图书馆开始采用/支持它。

以上是关于Java 8 模块与 OSGi 有何不同?的主要内容,如果未能解决你的问题,请参考以下文章

OSGi是什么:Java语言的动态模块系统

如何将特定的 java 模块嵌入到 OSGi 包中?甚至可能吗?

使用 Nrwl 的 Nx 中的数据持久性模块,悲观更新的实现与乐观更新有何不同

模块化模式与 OSGi

OSGI实战第一章

深入理解OSGI的模块化