我开始和一群朋友一起编写一个软件,并选择了Java语言,因为我们都熟悉它。
为了解决Java中的单类路径问题,我们选择使用OSGi。我们在项目中使用了Spring DM,Hibernate和CXF DOSGi。
花了很多精力让事情发挥作用。例如,我们想使用Spring注释来标记事务,这是一项相当困难的任务。我们得到了很多ClassNotFoundException
,为了解决它们,在import-package部分添加了导入,却不知道为什么需要它们(这些主要是Spring包)。
在完成整个过程后,我们认为可能我们选择了错误的语言?
所以我的问题是:
有哪些语言没有Java中的单一类路径问题?
这些语言如何解决问题?
使用这些语言而不是使用Java是否有任何缺点(除非我们必须学习它们)?
答案 0 :(得分:4)
问题不在于语言。您的问题是您的技术非常简单。 OSGi不是一个图书馆或秘密酱,添加后会给你神奇的模块化所带来的好处,其中包括你想要的多个“类空间”。 OSGi为模块化应用程序提供了结构,即应用程序由内聚和最小耦合组件构成。
您选择了流行但非常模块化的技术,如Spring和Hibernate。这些技术不是模块化的,因为它们严重依赖于单个类空间,因为它们普遍使用动态类加载(Class.forName)。即XML文件中的每个类名都是动态加载的。这个范例不仅需要一个全局类空间(这些类名称被有效地视为全局变量,这与任何CS学生应该知道的一样糟糕),它还使用实现类的名称。在模块外部使用实现类的名称是模块化的对立面。你的ClassNotFoundExceptions是OSGi告诉你有人不尊重它的模块围栏。也就是说,模块化必须与构造代码的方式相关,然后OSGi只提供运行这些模块的基础并强制执行它们的边界。
因此,OSGi有一种非常优雅且被低估的技术来创建非常强大的模块,这些模块不会受到全局变量和实现细节泄漏的影响:uServices。这些uServices是规范包中指定的对象,并通过轻量级代理在模块之间共享。 uServices实际上无需使用Spring XML。
不幸的是,目前最先进的技术是我们有很多Java开发人员,他们相信课堂加载黑客是你如何将开源项目粘合在一起的。
好消息是事情正在发生变化。目前很多项目开始制作他们的JAR捆绑(OSGi在maven中心受欢迎#33),尽管大多数端口只提供标题(使用maven central上最常下载的插件之一)。但是,一旦说完第一步,添加服务通常就不那么难了。我被OSGi联盟雇用来加速这个过程。实际上,JPA是我的首选!
回到原来的问题:据我所知,只有Java支持类加载器,这是多类空间的必备概念。我知道的所有动态语言只能通过他们的类名绑定,有效地排除了你的要求。所以我相信实际上没有其他选择......