Для сервера Java EE есть на самом деле только одна причина:
Поскольку Java EE предназначен, чтобы иметь эту функцию на сервере
Вы можете сравните это с JDK, где что-то вроде java.util.HashMap
предназначено для участия в установленном JDK. Вы не должны включать это в свое приложение.
Вы также можете сравнить это с Tomcat, когда речь заходит о классах Servlet, JSP, EL или WebSocket (которые в конечном итоге существуют и в баночках Tomcat). Вы не включаете тех, кто в вашей войне, поскольку они являются частью Tomcat, а не вашей заявки.
В Java EE многие из его составных частей (например, JSF, JPA, CDI и т. Д.) Имеют части, которые в значительной степени не зависят от других реализаций, но также и от частей, специфичных для сервера приложений. Это называется кодом SPI или кодом интеграции. Это делает возможным, чтобы CDI-компоненты могли быть введены в Servlets, CDI может добавить область для состоящего из сессионного компонента (и впоследствии уничтожить компонент при завершении области) и многое другое.
Из-за этого аспекта интеграции, как правило, невозможно обновить банки реализации (например, JSF) из-за войны, не говоря уже об обмене банками реализации с другой реализацией (например, Mojarra для MyFaces).
Теперь некоторые серверы имеют ограниченную поддержку определенных реализаций. Например. поскольку существует только две реализации JSF, поставщик может поддерживать их обоих и разрешить вам их заменять. К сожалению, это промах и ударил, работает ли это, и далеко не все функциональные возможности Java EE поддерживаются таким образом, если они вообще поддерживаются. Например. Сервлета, JSP и EJB, как известно, трудно поменять местами, несмотря на несколько ранних усилий здесь.
В целом преимущества использования этих блоков реализации на уровне сервера отдельно от архива приложений - это запуск и повторное развертывание, а также четкое разделение между приложением и кодом структуры. В частности, Java JEF, например JSF, не нужно сканировать аннотации при каждом повторном запуске/повторном развертывании приложения.
В любом случае Tomcat является своего рода промежуточным решением. У вас будут несколько классов/банок на уровне сервера (Servlet, JSP, EL, WebSockets, как указано), а некоторые в вашей войне (JSF, JPA и т. Д.). Это ИМХО не совсем оптимально.
Еще один вариант, который пришел в моду в последнее время, заключается в развертывании всего приложения-сервера + приложения в виде единственной запущенной банки («толстые банки»). Это не входит в объем этого ответа, чтобы подробно рассказать об этом здесь, но искать, например. WildFly Swarm или Payara embedded/micro.
p.s. это уже упоминалось несколько раз в других ответах, но мне также хотелось бы подчеркнуть, что развертывание нескольких несвязанных приложений на одном сервере приложений и последующее ожидание получения преимуществ памяти, как правило, не такая хорошая идея. Проблемы с безопасностью и использованием ресурсов, а также с модернизацией IMHO далеко, намного перевешивают любую потенциальную экономию памяти.
Действительно ли серверные библиотеки работают на вас? Если да, то вы можете использовать серверные библиотеки вместо упаковки дополнительных библиотек. Возможно, вам захочется подумать о том, совместимы ли все банки, необходимые вашему приложению, друг с другом. Не зная о каких-либо особых показателях производительности. – Atul