java - Java 8 模块与 OSGi 有何不同?

标签 java module osgi java-platform-module-system

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

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

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

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

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

最佳答案

正如评论中所述,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 - Java 8 模块与 OSGi 有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20634993/

相关文章:

java - Spring:覆盖父bean

java - 有没有更好的方法在 Java 中进行空检查?

module - 如何在 Racket 中获取自定义语言的命名空间?

ios - 在 Xcode 中对不同的目标使用相同的代码

java - 带有运行时 pojos 的 Hibernate 的 OSGi 片段包

osgi - 将 JavaMail 1.5 与 XPage 结合使用

java - 如何通过java matcher正则表达式检查IP范围

java - 使用套接字将图像从客户端发送到服务器

module - 从 Rust 中同一类的另一个静态方法引用静态方法的最佳方法是什么?

java - 来自随机代码行的 NullPointerExceptions