【问题标题】:Languages that don't have the single classpath issue in Java [closed]Java中没有单一类路径问题的语言[关闭]
【发布时间】:2013-08-27 08:26:56
【问题描述】:

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

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

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

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

所以我的问题是:

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

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

  3. 使用这些语言而不是使用 Java 有什么缺点吗(除了我们必须学习它们)?

【问题讨论】:

  • 单类路径问题到底是什么???
  • @Thihara 我们不能使用同一个库的两个版本,因为在运行时只会使用其中一个。使用 OSGi,每个包都有自己的类路径。请参阅版本控制部分here
  • 这似乎是使用 osgi 的一个非常糟糕的理由
  • @Thihara 在Why OSGi下的OSGi联盟网站中说版本控制是OSGi的优势之一。你的意思是说上面链接中的信息不准确吗?此外,如果我们的软件依赖于第三方库,那么它们很有可能会依赖于同一库的不同版本。
  • @NeilBartlett 我认为成为该语言的一部分很重要的原因是,如果该语言支持它,那么这意味着该语言被设计为模块化的。我认为这个问题很简单。如果有人知道解决问题的语言,他们可以简单地回复语言的名称:)

标签: java hibernate programming-languages osgi classpath


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 感谢您提供非常详细的回答
猜你喜欢
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2012-05-14
  • 2011-02-20
  • 1970-01-01
  • 2010-09-24
  • 1970-01-01
相关资源
最近更新 更多