OSGi、Java Modularity 和 Jigsaw

所以从昨天早上开始,我甚至不知道OSGi是什么。OSGi只是一些流行语,我一遍又一遍地看到,所以我终于留出一些时间来梳理它。

这实际上看起来很酷,所以我想首先声明(为了记录在案)我在任何方面都不是反OSGi的,也不是一些“OSGi抨击”的问题。

归根结底,OSGi似乎已经 - 基本上 - 解决了Java模块化的JSR 277,它认识到文件规范存在缺陷,在某些极端情况下可能导致命名空间解析和类加载问题。OSGi还做了很多其他非常酷的东西,但据我所知,这是它最大的吸引力(或其中之一)。JAR

对我来说 - 作为一个相当新的(几年现在)Java EE开发人员,我们正处于2011年,目前生活在Java 7时代,并且这些类加载问题仍然存在,这绝对是令人难以置信的;特别是在企业环境中,一个应用程序服务器上可能有数百个JAR,其中许多JAR依赖于彼此的不同版本,并且所有JAR都同时运行(或多或少)。

我的问题:

尽管我对OSGi很感兴趣,尽管我想开始学习它,看看它在哪里/是否对我的项目有用,但我只是没有时间坐下来学习那么大的东西,至少现在是这样。

那么,当这些问题出现时,非OSGi开发人员该怎么办呢?目前存在哪些Java(Oracle/Sun/JCP)解决方案(如果有的话)?为什么拼图是从J7上剪下来的?Jigsaw明年将在J8中实施的社区有多确定?是否有可能为您的项目获取Jigsaw,即使它还不是Java平台的一部分?

我想我在这里问的是恐慌,阴谋和面部表情的结合。现在我终于明白了OSGi是什么,我只是不明白“像Jigsaw这样的东西是如何花了20多年的时间才实现的,然后又是如何从发布中得到罐头的。这似乎是根本性的。

而且,作为一名开发人员,我也很好奇我的解决方案是什么,没有OSGi。

另外,注意:我知道这不是一个“纯编程”类型的问题,但是在你们中的一些人让鼻子弯曲变形之前,我想声明(再次,为了记录)我故意把这个问题放在SO上。那是因为我对我的SOers同胞只有最大的尊重,我正在寻找一些我每天潜伏在这里的“IT之神”的架构级答案。

但是,对于那些绝对坚持要用一些代码段来支持SO问题的人来说:

int x = 9;

(感谢任何能够权衡这个OSGi /Jigsaw/classloader/namespace/JAR地狱般的东西的人!


答案 1

首先要了解Jigsaw的主要用例是模块化JRE本身。作为次要目标,它将提供一个可能被其他Java库和应用程序使用的模块系统。

我的立场是,Jigsaw这样的东西可能只对JRE是必要的,但是如果其他Java库或应用程序使用,它将产生比它声称要解决的问题更多的问题。

JRE是一个非常困难和特殊的情况。它已经超过12年了,是一个可怕的混乱,充满了依赖循环和荒谬的依赖关系。同时被大约900万开发人员和可能数十亿正在运行的系统使用。因此,如果 JRE 重构创建了重大更改,则绝对不能重构 JRE。

OSGi是一个模块系统,可以帮助您(甚至强制您)创建模块化软件。您不能简单地将模块化洒在现有的非模块化代码库之上。将非模块化代码库转换为模块化代码库不可避免地需要一些重构:将类移动到正确的包中,使用解耦服务替换直接实例化,等等。

这使得很难将OSGi直接应用于JRE代码库,但我们仍然需要将JRE拆分为单独的部分或“模块”,以便可以提供JRE的精简版本。

因此,我认为Jigsaw是一种“极端措施”,可以在拆分JRE代码的同时保持其活力。它助于代码变得更加模块化,而且我相信它实际上会增加发展任何使用它的库或应用程序所需的维护。

最后:OSGi存在,而Jigsaw还不存在,可能永远不会存在。OSGi 社区在开发模块化应用程序方面拥有 12 年的经验。如果你对开发模块化应用程序非常感兴趣,OSGi是镇上唯一的游戏。


答案 2

这很简单,如果你想在今天的Java中进行真正的基于组件的开发,那么OSGi是镇上唯一的游戏。

在我看来,Jigsaw是JDK中可行的妥协以及SUN和OSGi之间先前的不良关系的结合。也许它会随Java 8一起发布,但我们必须拭目以待。

如果你在一个典型的企业环境中工作,OSGi不是灵丹妙药,你需要熟悉类加载的工作原理,因为许多知名的库(看看你,Hibernate)对类可见性做出了假设,这些假设在OSGi中不再有效。

我喜欢OSGi,但我不会尝试将其改造到现有系统中。我还会权衡绿地开发方面的利弊 - 我建议看看Apache或Eclipse产品,它们简化了OSGi的生活,而不是自己做。

如果你没有做OSGi,那么你的运气不好,如果你想出了一个依赖于同一库的不同版本的系统 - 你所能做的就是尝试避免这个问题,尽管需要一个库的多个版本对我来说似乎是一种架构“气味”。


推荐