Стандарт загрузки классов Java EE
WebSphere идет с родительским последним и родительским первым. Это Java EE совместимо? Поддерживается ли это всеми серверами приложений, совместимыми с Java EE 5?
2 ответа
Я провел собственное исследование (просматривая спецификации и несколько блогов), и вот что я понял
EAR
Спецификация НЕ определяет и не предписывает, как загрузчики классов должны работать в EAR. Однако это определяет, что
- ДОЛЖЕН быть загрузчик классов контекста потока для загрузки классов во время выполнения
- МОЖЕТ существовать иерархический механизм загрузки классов для разрешения классов (поставщики серверов приложений могут свободно реализовывать любой способ, который они захотят)
- загрузчик классов верхнего уровня (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. Вы добиваетесь изоляции приложения. Я не вижу людей, рекомендующих так или иначе. Сталкивались ли вы с такими рекомендациями передовой практики?