OSGi,Java模块化和拼图

所以从昨天早上起,我甚至都不知道OSGi是什么。 OSGi只是一个口号,我不断地看到一遍又一遍,所以我终于留出了一些时间来刷它。

它实际上看起来好像很酷,所以我想先说(logging)我不是在任何方面都反OSGi,这也不是什么“OSGi-bashing”的问题。

在这一天结束的时候,OSGi似乎已经在本质上解决了Java模块化的JSR 277问题,该模块认识到JAR文件规范存在缺陷,可能导致在特定情况下的名称空间parsing和类加载问题。 OSGi也做了很多其他很酷的东西,但从我所能确定的,这是它最大的吸引力(或其中之一)。

对我来说 – 作为一个相当新的Java EE开发者(现在几年),我们在2011年,目前生活在Java 7时代,而且这些类加载问题仍然存在是非常令人难以置信的。 尤其是在一个应用程序服务器上可能有数百个JAR的企业环境中,其中许多依赖于不同版本的相互之间以及所有正在运行(或多或less)的JAR。

我的问题:

就像我在OSGi中一样感兴趣,尽pipe我想要开始了解它,看看它是否可以用于我的项目,但我没有时间坐下来学习一些大型的,至less现在。

那么当这些问题出现时,非OSGi开发者应该做些什么呢? 目前存在哪些Java (Oracle / Sun / JCP)解决scheme? 为什么从J7剪切拼图? Jigsaw明年将在J8上实现的社区有多less? 即使它不是Java平台的一部分,是否有可能为您的项目获得Jigsaw?

我想我在这里问的是一个恐慌,阴谋和facepalm的组合。 现在我终于明白OSGi是什么了,我只是不知道Jigsaw已经花费了20多年的时间才能实现,而如何才能从发行版本中解放出来。 这似乎是基本的。

作为开发人员,我也很好奇我的解决scheme是什么,OSGi。

另外, 注意 :我知道这不是一个“ 纯编程 ”types的问题,但是在你们中的一些人的鼻子弯曲变形之前,我想(再次logging下来)我故意把这个问题所以。 那是因为我没有任何东西,只是对我的同胞们极为尊重,而且我正在寻找一些我每天都在这里潜伏的“IT之神”的build筑层面的答案。

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

 int x = 9; 

(感谢任何能够衡量这个OSGi / Jigsaw / classloader / namespace / JAR的东西!)

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

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

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

OSGi是一个模块系统,可以帮助你(甚至强迫你)创build模块化的软件。 您不能简单地在现有的非模块化代码库之上撒上模块。 将非模块化的代码库变成模块化代码库不可避免地需要进行一些重构:将类移入正确的包,用直接实例化来替代使用解耦服务等等。

这使得很难将OSGi直接应用到JRE代码库,但是我们仍然有要求将JRE拆分成单独的部分或“模块”,以便可以传递JRE的精简版本。

因此,我将Jigsaw视为一种“ 极端的措施 ”,以保持JRE代码在分离的同时保持活跃。 它没有帮助代码变得更加模块化,我相信它实际上会增加进行使用它的任何库或应用程序所需的维护。

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

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

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

如果你在一个典型的企业环境中工作,OSGi不是万能的,你需要熟悉类加载是如何工作的,因为众多知名的库(看着你,Hibernate)对类可见性的假设不再有效在OSGi内部。

我喜欢OSGi,但是我不会尝试将其改造成现有的系统。 我还要权衡绿地开发方面的优缺点 – 我build议您查看简化OSGi生活的Apache或Eclipse产品,而不是自己动手做。

如果你没有使用OSGi,那么如果你想出了一个依赖于同一个库的不同版本的系统,那么你的运气就不好了 – 你所能做的就是尽量避免这个问题,尽pipe需要多个版本的图书馆看起来像一个build筑“闻”给我。

我喜欢你用“angular落案例”来形容当前的情况。

JAR文件规范有一些缺点,可能导致在某些特定情况下的名称空间parsing和类加载问题

无论如何,因为多年来我一直对支持创build和更好执行的工具和技术感兴趣,所以编码比没有它们的结果更清晰,更分离,更连贯,更易于维护。 testing驱动devise和Junit就是这样一个组合。

在花费了几个月的时间将大部分代码移到OSGi之后,我会说OSGi在这方面是一个更好的工具。 这是移动到OSGi的充分理由。 从长远来看,它会为你节省很多钱。

而且,作为奖励,它会给你一个做很多很酷的东西的机会。 想象一下,在演示过程中,无缝地升级authentication模块,而不会丢失stream量,以支持OAuth …再次创造出一种乐趣!