Стандарт загрузки классов Java EE

WebSphere идет с родительским последним и родительским первым. Это Java EE совместимо? Поддерживается ли это всеми серверами приложений, совместимыми с Java EE 5?

2 ответа

Решение

Я провел собственное исследование (просматривая спецификации и несколько блогов), и вот что я понял

EAR

Спецификация НЕ определяет и не предписывает, как загрузчики классов должны работать в EAR. Однако это определяет, что

  1. ДОЛЖЕН быть загрузчик классов контекста потока для загрузки классов во время выполнения
  2. МОЖЕТ существовать иерархический механизм загрузки классов для разрешения классов (поставщики серверов приложений могут свободно реализовывать любой способ, который они захотят)
  3. загрузчик классов верхнего уровня (WAR/EAR) МОЖЕТ делегировать загрузчикам классов низкого уровня (таким как Bootstrap, расширение и т. д.). Это соответствует модели делегирования загрузчика классов J2SE (PARENT_FIRST в WAS)

WAR

Спецификация сервлета определяет и предписывает поддержку модели загрузки классов PARENT_LAST (т.е. WAR/web-inf/classes и WAR/web-inf/lib имеют приоритет над библиотеками, которые поставляются с сервером приложений). Но это только для модулей WAR. В этом случае спецификация сервлета отличается от стандартной модели делегирования J2SE PARENT_FIRST.

Ссылка

Спецификация: Servlet 2.3, раздел: 9.7.2 Web Application Classloader

Спецификация: Java EE 5, Раздел: EE.6.2.4.7 Загрузчик класса контекста

Особенности сервера приложений

Интересно, однако, что большинство основных серверов приложений поддерживают некоторый механизм отключения делегирования для изоляции приложения от сервера приложений в случае необходимости (из-за конфликтов или иным образом): WebSphere - "родитель-последний", GlassFish - <class-loader delegate="false">, JBoss - java2ParentDelegation=falseГеронимо - <java2-delgation-model>false</java2-delegation-model>

Хорошая информация Я исследовал тот же вопрос и пришел к аналогичным выводам. Остается один вопрос: рекомендуется ли использовать опцию Parent Last? Я думаю, что так будет, поскольку ваше приложение более переносимо; Вы не зависите от библиотек Appserver. Вы добиваетесь изоляции приложения. Я не вижу людей, рекомендующих так или иначе. Сталкивались ли вы с такими рекомендациями передовой практики?

Другие вопросы по тегам