У меня есть вопрос относительно гарантий, если таковые имеются, в следующем сценарии (обратите внимание, что вопрос не "Как это сделать по-другому?", вопрос действительно о порядке загрузки классов в следующем (лучше понять, как работает загрузка классов).
Вот гипотетический сценарий... Там есть .war файл, который имеет следующую (частичную) структуру каталогов:
WEB-INF/classes/com/acme/Bunny.class
.
.
.
WEB-INF/lib/acme.jar
Оба файла Bunny.class имеют импорт, ссылающийся на другие классы из acme.jar
Bunny.class в WEB-INF/classes/... является единственным классом, который имеет то же имя/путь, что класс из acme.jar.
Файл .jar acme.jar также содержит com.acme.Bunny(и нет специальных трюков загрузчика класса).
Я понимаю, что спецификация Java гарантирует, что класс не будет загружен до тех пор, пока он не будет использован (или "вручную загружен классом" специально) программой, поэтому, если вы используете тысячи .jar, скажем, в .war, classloader (s) не запускают загрузку классов десятками тысяч классов.
(редактировать)
Но как насчет порядка, в котором два класса в приведенных выше примерах загружен?
должен быть сформулирован:
Но как решено, какая из загружены два класса выше?
или что-то в этом роде:)
Там одна гарантия сделана: com.acme.Bunny должен использоваться перед любым другим классом из com.acme....
В принципе, в Википедии написано:
Самые сложные проблемы с JAR hell возникают в обстоятельствах, которые Преимущество полной сложности система загрузки классов. Java программе не требуется использовать только один "плоский" загрузчик классов, но вместо этого может состоять из нескольких (или в факт, неопределенное число) вложенных, взаимодействующих загрузчиков классов. Классы загруженные разными загрузчиками классов, могут взаимодействовать сложными способами не полностью понятный разработчиком, ведущий к необъяснимым ошибкам или ошибкам.
Итак, мне интересно: могу ли я быть уверенным, что /classes/com/acme/Bunny.class будет загружаться по классу до того, как из .jar в WEB-INF/lib/dir или нет?