2008-12-16 121 views

回答

29

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

你的程序是不是一个固定的实体,而是由JVM在特定情况下加载的类的确切集合。

这是非常可能是在情况下会导致因解析规则完全不同的结果在不同的平台,甚至在同一个相同的命令行。

标准库可能存在差异(很常见)。图书馆可以彼此隐藏(旧版本甚至可以用来代替新版本)。目录结构可能会解决问题。同一类的不同版本可能会出现在多个库中,并且将会使用遇到的第一个类,等等。由于Java按规范使用了首次遇到的策略,所以未知的排序依赖性可能会导致问题。当然,由于这是命令行,它是规范的一部分,所以没有真正的警告。

这仍然是一个问题。例如,在Mac OS上,来自苹果的可怕支持意味着你的机器最终会有几个JVM和几个JRE,而且你永远不会轻易地将东西从一个地方放到另一个地方。如果您有被编译其他库的具体的,但不同版本的多个库,你coulld有问题,等

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

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

BTW:类路径也是一个问题,如果你使用的是使用非默认的类加载器的环境。例如,我在Eclipse下运行诸如Hibernate或Digester之类的问题,因为类加载器不兼容。

2

我觉得“类路径地狱”是指当一个Java应用程序的类路径中只能使用CLASSPATH环境变量设置的时间。这导致许多应用程序需要更改全局系统配置(每个操作系统都不同),应用程序之间的版本冲突以及一般混淆。

2

这是一个较为具体的例子:

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

欲了解更多示例,请参阅http://en.wikipedia.org/wiki/Java_Classloader#JAR_hell