类路径地狱是Java进行的那种动态链接的不幸结果。
您的程序不是固定的实体,而是JVM在特定实例中加载的确切类集。
由于解析规则,在不同平台上甚至同一平台上的同一命令行可能会导致完全不同的结果。
标准库可能存在差异(非常常见)。图书馆可以彼此隐藏(甚至可以使用旧版本代替较新的版本)。目录结构可能会使解析混乱。同一类的不同版本可能会出现在多个库中,并且将使用遇到的第一个库,依此类推。由于Java按照规范使用了第一个遇到的策略,因此未知的顺序依赖性可能导致问题。当然,由于这是命令行并且是规范的一部分,因此没有真正的警告。
这仍然是一个问题。例如,在Mac
OS上,Apple的可怕支持意味着您的计算机最终会带有多个JVM和几个JRE,并且您永远都不可能轻易地随意放置东西。如果您有多个针对特定但不同版本的其他库编译的库,则可能会遇到问题等。
但是,此问题不是Java固有的。我记得在90年代编程Windows时遇到的DLL地狱情况。在任何情况下,您都必须依靠文件系统中的某些内容来组装程序,而不是拥有一个定义明确的可执行文件,这是一个问题。
但是,此模型的好处仍然很大,因此我愿意容忍这种情况。Sun方面也朝着正确的方向迈出了一步。例如,Java6允许您仅使用jar指定目录,而不必枚举它们。
顺便说一句:如果您正在使用使用非默认类加载器的环境,类路径也是一个问题。例如,由于类加载器不兼容,我在Eclipse下运行诸如Hibernate或Digester之类的问题很多。



