问题

所以截至昨天早上我还没有找到OSGi甚至是什么的线索.OSGi只是一些流行语,我一直看到一遍又一遍地出现,所以我最后留出一些时间来清理它。

它实际上看起来很酷,所以我想首先说明(记录)我在任何方面都不反O​​SGi,也不是一些"OSGi-bashing"问题。

在一天结束时,似乎OSGi已经 - 实质上 - 已经解决了Java Modularity的问题,它认识到JAR文件规范存在缺点,这些缺陷可能导致在某些极端情况下进行命名空间解析和类加载问题。 OSGi还做了很多其他非常酷的东西,但从我可以确定的,这是它最大的吸引力(或者其中之一)。

对我来说 - 作为一个相当新的(几年前)Java EE开发人员,我们在2011年并且目前生活在Java 7时代,并且这些类加载问题仍然存在,这绝对令人难以置信。特别是在一个应用服务器上可能有数百个JAR的企业环境中,其中许多应用服务器依赖于彼此的不同版本,并且所有应用服务器同时运行(或多或少)。
我的问题:
我和OSGi一样感兴趣,并且我想开始了解它以了解它在哪里/是否可以用于我的项目,我只是没有时间坐下来学习一些大的东西,至少现在。

那么当这些问题出现时,非OSGi开发人员应该做些什么呢?目前存在WhatJava(Oracle / Sun / JCP)解决方案,如果有的话?为什么Jigsaw从J7切入? Jigsaw明年将在J8实施的社区有多确定?即使它不是Java平台的一部分,是否有可能为你的项目获得Jigsaw?

我想我在这里问的是恐慌,阴谋和一个facepalm的组合。现在我终于明白OSGi是什么了,我只是不"得到"像Jigsaw这样的东西需要花费20年的时间才能实现,然后如何才能从一个版本中获得.这似乎是根本的。

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

另外,注意:我知道这不是一个"纯编程"类型的问题,但是在你们中的一些人让你的鼻子弯曲变形之前,我想说(再次,为了记录)我故意把这个关于SO的问题。那是因为除了对我的同伴们的尊重之外我什么都没有,而且我正在寻找一些我所看到的每天潜伏在这里的"IT之神"的建筑级答案。

但是,对于那些绝对认为某个代码段支持SO问题的人:

int x = 9;

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


#1 热门回答(96 赞)

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

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

JRE是一个非常困难和特殊的案例。它已经超过12年了,是一个可怕的混乱,充满了依赖循环和荒谬的依赖。与此同时,大约9百万开发人员和大约亿运行系统使用了。因此,如果重构创建了重大更改,则绝对无法重构JRE。

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

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

因此,我认为Jigsaw是一种"极端措施",以保持JRE代码在分裂时保持活跃状态​​。它使得代码变得更加模块化,并且我确信它实际上会增加进化任何使用它的库或应用程序所需的维护。

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


#2 热门回答(20 赞)

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

在我看来,Jigsaw结合了对JDK中可行的东西以及之前SUN和OSGi家伙之间糟糕关系的妥协。也许它将附带Java 8,但我们必须拭目以待。

如果你在典型的企业环境中工作,OSGi并不是灵丹妙药,你需要熟悉类加载的工作方式,因为众多知名库(看着你,Hibernate)对类可见性做出了不再有效的假设在OSGi内部。

我喜欢OSGi,但我不会尝试将它改装到现有系统。我还要考虑绿地开发方面的优缺点 - 我建议你查看简化OSGi生活的Apache或Eclipse产品,而不是自己动手。

如果你没有做OSGi,那么如果你想出一个依赖于同一个库的不同版本的系统,你就不幸了 - 所有你能做的就是尽量避免这个问题,尽管需要多个版本的图书馆对我来说似乎是一种"气味"。


#3 热门回答(13 赞)

我喜欢你用"角落案例"来描述当前的情况。

JAR文件规范存在缺点,在某些极端情况下可能导致名称空间解析和类加载问题

无论如何,多年来我一直对支持创建,甚至更好地执行代码的工具和技术感兴趣,这些代码比没有它们的结果更清晰,更分离,更连贯,更易于维护。测试驱动设计和Junit就是这样的组合。

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

而且,作为奖励,它会让你有机会做很多很酷的事情。想象一下,在演示过程中,无需流量丢失即可无缝升级身份验证模块,以支持OAuth ......创建内容时,它突然变得更加快乐!


原文链接