Ад Classpath является печальным следствием динамического связывания, аналогичного тому, которое осуществляется Java.
Ваша программа - это не фиксированная сущность, а точный набор классов, загружаемых JVM в конкретном экземпляре.
Очень возможно быть в ситуациях, когда одна и та же командная строка на разных платформах или даже на одной и той же может привести к совершенно разным результатам из-за правил разрешения.
Могут быть различия в стандартных библиотеках (очень часто). Библиотеки могут быть скрыты друг другом (более старая версия может даже использоваться вместо более новой). Структура каталогов может помешать разрешению. Другая версия одного и того же класса может появиться в нескольких библиотеках, и будет использоваться первая найденная версия и т. Д. Поскольку Java по спецификации использует политику первого столкновения, неизвестные упорядоченные зависимости могут привести к проблемам. Конечно, поскольку это командная строка и часть спецификации, никаких предупреждений нет.
Это очень большая проблема. Например, в Mac OS ужасная поддержка Apple означает, что на вашей машине установлено несколько JVM и несколько JRE, и вы никогда не сможете легко переносить вещи с места на место. Если у вас есть несколько библиотек, скомпилированных для конкретных, но разных версий других библиотек, у вас могут возникнуть проблемы и т. Д.
Однако эта проблема не присуща Java. Я помню свою долю ситуаций с адом DLL при программировании окон в 90-х годах. Любая ситуация, когда вам нужно рассчитывать на что-то в файловой системе для сборки вашей программы, а не на наличие одного четко определенного исполняемого файла, является проблемой.
Однако преимущества этой модели по-прежнему велики, поэтому я готов терпеть этот ад. Есть также шаги в правильном направлении на стороне Солнца. Например, Java6 позволяет вам просто указывать каталог с jars, а не перечислять их.
Кстати: пути к классам также являются проблемой, если вы используете среду, которая использует загрузчик классов не по умолчанию. Например, у меня было много проблем с запуском таких вещей, как Hibernate или Digester под Eclipse, потому что загрузчики классов были несовместимы.