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

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

Ответы

Ответ 1

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

EAR

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

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

WAR

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

Ссылка

Спецификация: Servlet 2.3, раздел: 9.7.2. загрузчик классов веб-приложений

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

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

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

Ответ 2

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