什么是类路径地狱,它是否真的是Java的问题?
什么是类路径地狱,它是否真的是Java的问题?
类路径地狱是Java执行的那种动态链接的不幸后果。
您的程序不是一个固定的实体,而是 JVM 在特定实例中加载的确切类集。
由于解析规则,很可能在不同平台上甚至在同一平台上使用相同的命令行会导致完全不同的结果。
标准库中可能存在差异(非常常见)。库可以相互隐藏(甚至可以使用旧版本而不是较新的版本)。目录结构可能会破坏解析。同一类的不同版本可能会出现在多个库中,并且将使用遇到的第一个版本,依此类推。由于 Java(根据规范)使用首次遇到的策略,因此未知的排序依赖关系可能会导致问题。当然,由于这是命令行并且是规范的一部分,因此没有真正的警告。
这在很大程度上仍然是一个问题。例如,在Mac OS上,Apple的可怕支持意味着您的机器最终会获得几个JVM和几个JRE,并且您永远无法轻松地将事情从一个地方到另一个地方。如果您有多个库是针对其他库的特定但不同版本编译的,那么您会遇到问题,等等。
但是,这个问题并不是Java固有的。我记得我在90年代编程窗口时遇到的DLL地狱情况。任何必须依靠文件系统中的某些东西来组装程序而不是拥有一个定义良好的可执行文件的情况都是一个问题。
但是,这种模式的好处仍然很大,所以我愿意容忍这种地狱。在太阳的一侧也有朝着正确方向迈出的台阶。例如,Java6 允许您简单地指定一个包含 jar 的目录,而不必枚举它们。
顺便说一句:如果您使用的是使用非缺省类装入器的环境,则类路径也是一个问题。例如,我在 Eclipse 下运行 Hibernate 或 Digester 等内容时遇到了很多问题,因为类加载器不兼容。
Classpath/jar-hell有几个逃生舱口,如果它们对你的项目有意义的话: