【问题标题】:What is classpath hell and is/was it really a problem for Java?什么是类路径地狱,它是否真的是 Java 的问题?
【发布时间】:2010-09-27 06:08:12
【问题描述】:

什么是类路径地狱,它对 Java 来说是否真的是个问题?

【问题讨论】:

标签: java history


【解决方案1】:

类路径地狱是 Java 执行的那种动态链接的不幸结果。

您的程序不是一个固定的实体,而是由 JVM 在特定实例中加载的确切类集。

很可能会出现在不同平台甚至同一个平台上的相同命令行由于解析规则而导致完全不同的结果的情况。

标准库中可能存在差异(非常常见)。库可以相互隐藏(甚至可以使用旧版本而不是新版本)。目录结构可能会弄乱解析。同一个类的不同版本可能会出现在多个库中,并且将使用第一个遇到的版本,等等。由于 Java 按照规范使用第一次遇到的策略,未知的排序依赖关系可能会导致问题。当然,由于这是命令行并且是规范的一部分,因此没有真正的警告。

这仍然是一个问题。例如,在 Mac OS 上,来自 Apple 的可怕支持意味着您的机器最终会使用多个 JVM 和多个 JRE,并且您永远无法轻松地将东西从一个地方转移到另一个地方。如果您有多个针对特定但不同版本的其他库编译的库,您可能会遇到问题,等等。

然而,这个问题并不是 Java 所固有的。我记得我在 90 年代编写 Windows 时遇到的 DLL 地狱情况。在任何情况下,您都必须依靠文件系统中的某些东西来组装您的程序,而不是拥有一个定义良好的可执行文件。

不过,这种模式的好处还是很大的,所以我愿意忍受这个地狱。孙这边也有朝着正确方向的台阶。例如,Java6 允许您简单地使用 jar 指定一个目录,而不必枚举它们。

顺便说一句:如果您使用的是使用非默认类加载器的环境,类路径也是一个问题。例如,由于类加载器不兼容,我在 Eclipse 下运行 Hibernate 或 Digester 时遇到了很多问题。

【讨论】:

    【解决方案2】:

    Classpath/jar-hell 有几个逃生口,如果它们对您的项目有意义的话:

    【讨论】:

      【解决方案3】:

      我认为“类路径地狱”是指 Java 应用程序的类路径只能通过使用 CLASSPATH 环境变量来设置的时候。这导致许多应用程序需要更改全局系统配置(每个操作系统都不同)、应用程序之间的版本冲突以及普遍的混乱。

      【讨论】:

        【解决方案4】:

        这是一个更具体的例子:

        当两个库(或一个库 和应用程序)需要相同的第三个不同版本 图书馆。如果第三个库的两个版本都使用同一个类 名称,无法加载第三个库的两个版本 相同的类加载器。

        http://en.wikipedia.org/wiki/Java_Classloader#JAR_hell 中寻找更多示例。

        【讨论】:

          【解决方案5】:

          http://mindprod.com/jgloss/classpath.htmlhttp://java.sun.com/javase/6/docs/technotes/tools/windows/classpath.html 这里有很多好东西

          当我没有设置时,我只有在使用 -cp 时才遇到类路径问题。试图弄清楚您的第三方软件如何设置其类路径有时会很痛苦。

          【讨论】:

            猜你喜欢
            • 2011-07-15
            • 2014-04-11
            • 2017-01-04
            • 1970-01-01
            • 1970-01-01
            • 2020-12-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多