26

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

4

5 回答 5

36

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

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

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

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

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

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

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

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

于 2008-12-17T00:05:02.487 回答
3

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

于 2008-12-17T00:54:35.507 回答
2

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

于 2008-12-17T00:25:19.480 回答
2

这是一个更具体的例子:

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

http://en.wikipedia.org/wiki/Java_Classloader#JAR_hell获取更多示例。

于 2011-12-06T14:53:02.233 回答
1

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

当我没有设置自己使用-cp时,我只遇到了类路径问题。试图弄清楚你的第三方软件如何设置他们的类路径有时会很痛苦。

于 2008-12-16T23:52:58.453 回答