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