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

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

Ответы [ 5 ]

32 голосов
/ 17 декабря 2008

Ад Classpath является печальным следствием динамического связывания, аналогичного тому, которое осуществляется Java.

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

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

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

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

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

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

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

3 голосов
/ 17 декабря 2008

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

2 голосов
/ 06 декабря 2011

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

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

Возьмите лут в http://en.wikipedia.org/wiki/Java_Classloader#JAR_hell для большего количества примеров.

2 голосов
/ 17 декабря 2008

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

1 голос
/ 17 декабря 2008

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

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

...