0

我开始和一群朋友一起写一个软件,并选择了 Java 语言,因为我们都熟悉它。

为了解决 Java 中的单一类路径问题,我们选择使用 OSGi。我们在项目中使用了 Spring DM、Hibernate 和 CXF DOSGi。

需要付出很多努力才能使事情正常进行。例如,我们想使用 Spring 注解来标记事务,这是一项相当困难的任务。我们得到了很多ClassNotFoundExceptions,为了解决它们,在 import-package 部分添加了导入,但不知道为什么需要它们(这些主要是 Spring 包)。

在经历了这个过程之后,我们认为也许我们选择了错误的语言?

所以我的问题是:

  1. 哪些语言没有 Java 中的单一类路径问题?

  2. 这些语言如何解决问题?

  3. 使用这些语言中的任何一种而不是使用 Java 是否有任何缺点(除了我们必须学习它们的事实)?

4

1 回答 1

4

问题不在于语言。您的问题是您的技术非常不模块化。OSGi 不是一个库或秘密工具,当添加它时,它会神奇地为您提供模块化的所有好处,其中包括您想要的多个“类空间”。OSGi 为模块化应用程序提供了结构,即应用程序由内聚和最小耦合的组件构建而成。

您选择了流行但高度非模块化的技术,例如 Spring 和 Hibernate。这些技术不是模块化的,因为它们严重依赖单个类空间,因为它们普遍使用动态类加载 (Class.forName)。即,XML 文件中的每个类名都是动态加载的。这种范式不仅需要一个全局类空间(这些类名被有效地视为全局变量,这是任何 CS 学生都应该知道的),它还使用实现类的名称。在其模块之外使用实现类的名称是模块化的对立面。您的 ClassNotFoundExceptions 是 OSGi 告诉您有人不尊重其模块围栏。也就是说,模块化必须以您构建代码的方式出现,然后 OSGi 只提供一个底层来运行这些模块并强制它们的边界。

所以 OSGi 有一个非常优雅但被严重低估的技术来创建非常强大的模块,这些模块不会受到全局变量和实现细节泄漏的影响:uServices。这些 uService 是在规范包中指定的对象,并通过轻量级代理在模块之间共享。uServices 实际上不需要 Spring XML。

不幸的是,目前最先进的技术是,我们有很多 Java 开发人员从小就相信类加载技巧是您将开源项目粘合在一起的方式。

好消息是事情正在发生变化。目前,许多项目开始制作他们的 JAR 包(OSGi 在 maven Central 上的流行度排名第 33),尽管大多数端口只是提供标头(使用 maven Central 上下载最多的插件之一)。但是,一旦说了这一步,添加服务通常并不难。我受雇于 OSGi 联盟来加快这个过程。实际上,JPA 是我的首选!

回到你原来的问题:据我所知,只有 Java 支持类加载器,这是多个类空间的必要概念。我所知道的所有动态语言仅通过它们的类名绑定,有效地排除了您的要求。所以我相当有信心实际上没有其他选择......

于 2013-08-24T15:57:36.023 回答