Подтвердить что ты не робот

Что такое адский класс, и это/действительно ли это проблема для Java?

Что такое адский путь к классам и является/действительно ли это проблемой для Java?

4b9b3361

Ответ 1

Адриатический путь - это неудачное следствие динамической компоновки, выполняемой Java.

Ваша программа не является фиксированной сущностью, а точным набором классов, загружаемых JVM в конкретном экземпляре.

Очень возможно быть в ситуациях, когда одна и та же командная строка на разных платформах или даже одна и та же приведет к совершенно другим результатам из-за правил разрешения.

В стандартных библиотеках могут быть различия (очень распространены). Библиотеки могут быть скрыты друг от друга (более старая версия может быть использована вместо более новой). Структура каталогов может привести к беспорядочному разрешению. Другая версия того же класса может отображаться в нескольких библиотеках, и первая из них будет использоваться и т.д. Так как Java по спецификации использует политику с первой встречей, неизвестные зависимости заказа могут привести к проблемам. Конечно, поскольку это командная строка и она является частью спецификации, реальных предупреждений нет.

Это все еще проблема. Например, на Mac OS ужасная поддержка Apple означает, что у вас машина заканчивается несколькими JVM и несколькими JRE, и вы никогда не сможете легко рисовать вещи с места на место. Если у вас есть несколько библиотек, которые были скомпилированы для конкретных, но разных версий других библиотек, у вас возникли проблемы и т.д.

Однако эта проблема не присуща Java. Я помню свою долю в адских ситуациях в DLL во время программирования окон в 90-х годах. Любая проблема, когда вам приходится рассчитывать на что-то в файловой системе для сборки вашей программы, а не с помощью одного четко определенного исполняемого файла, является проблемой.

Однако преимущества этой модели по-прежнему велики, поэтому я готов терпеть этот ад. Есть также шаги в правильном направлении на стороне Солнца. Например, Java6 позволяет вам просто указать каталог с банками, а не перечислить их.

BTW: Пути классов также являются проблемой, если вы используете среду, в которой используется загрузчик классов по умолчанию. Например, у меня было много проблем с такими типами, как Hibernate или Digester под Eclipse, потому что загрузчики классов были несовместимы.

Ответ 2

Classpath/jar-hell имеет пару вылетающих люков, если они имеют смысл для вашего проекта:

Ответ 3

Я думаю, что "classpath hell" относится к тому времени, когда путь к классам Java-приложения можно было установить только с помощью переменной среды CLASSPATH. Это привело ко многим приложениям, требующим изменений в глобальной конфигурации системы (различной для каждой ОС), конфликтов версий между приложениями и общей путаницы.

Ответ 4

Это несколько более конкретный пример:

Когда две библиотеки (или библиотека и приложение) требуют разные версии той же третьей библиотека. Если обе версии третьей библиотеки используют один и тот же класс имена, нет возможности загружать обе версии третьей библиотеки с помощью тот же загрузчик классов.

Возьмите добычу в http://en.wikipedia.org/wiki/Java_Classloader#JAR_hell для получения дополнительных примеров.

Ответ 5

Здесь много хороших вещей http://mindprod.com/jgloss/classpath.html и http://java.sun.com/javase/6/docs/technotes/tools/windows/classpath.html

У меня были только проблемы с classpaths, когда я не устанавливаю, я сам использую -cp. Попытка выяснить, как ваше стороннее программное обеспечение устанавливает свои пути к классам, может быть больно время от времени.