2015-08-13 4 views
3

У нас есть приложение, которое включает в себя все библиотеки libs (jsf, javassit, slf4f vs ...). Потому что мы разработали его на tomcat, а tomcat не предоставляет никакой дополнительной библиотеки. Мы пытаемся переместить его на серверы Java EE, такие как Weblogic, Jboss, Websphere vs ...Почему я должен использовать Java EE-серверы вместо приложений libs?

Мой вопрос в том, почему я предпочитаю серверные библиотеки вместо своих приложений? Имеют ли серверные библиотеки лучшую производительность? Я могу изменить порядок загрузки классов, и я могу использовать эти серверы только для контейнера сервлетов.

+0

Действительно ли серверные библиотеки работают на вас? Если да, то вы можете использовать серверные библиотеки вместо упаковки дополнительных библиотек. Возможно, вам захочется подумать о том, совместимы ли все банки, необходимые вашему приложению, друг с другом. Не зная о каких-либо особых показателях производительности. – Atul

ответ

0

Использование серверных библиотек не обязательно должно обеспечивать какие-либо преимущества в производительности, однако вы должны понимать, почему они предпочитают библиотеки приложений.

Файлы Libs/JAR могут быть неявно указаны.

Если у вас есть несколько различных приложений, которые используют, скажем, платформу Spring, может быть проще разместить файлы Spring JAR в общем месте, с которым могут ссылаться все утилиты. Это позволяет избежать появления нескольких копий JAR-файлов по всей файловой системе.

Общее расположение среды выполнения JAR для JAR, известное как «каталог расширений», по умолчанию находится в подкаталоге lib/ext под установленным местоположением JRE.

JRE - это настраиваемое местоположение, но оно так редко настраивается в данной среде Java, что вполне безопасно предположить, что lib/ext является безопасным местом для хранения JAR и что они будут неявно доступны на Java среда CLASSPATH.

В конечном итоге это упростит развертывание!

0

Многие из распространенных аспектов конфигурации приложений в настоящее время управляются серверами приложений Java EE, такими как поддержание параметров источников данных (db-соединения), JMS и EJB. Затем сервер Java EE предоставляет механизм поиска, такой как JNDI и т. Д. Для доступа к этим функциям. Таким образом, все соответствующие банки должны быть частью папки Java EE servers lib.

Теперь все общие банки, имеющие отношение ко многим приложениям могут быть сохранены в j2ee сервер Lib но Nowdays поддержания его в центральном хранилище, как связующие/Maven является более подходящим вариантом

+0

Ваши собственные библиотеки также должны иметь доступ к источнику данных, настройкам JMS и EJB, нет? – Mark

+0

Нет необходимости, когда вы настраиваете поиск, например, JNDI и т. Д. –

0

Использования библиотек загружены на сервере экономит вам много память, если есть другие webapps, которые используют одни и те же библиотеки. Их нужно загружать только один раз. Если нет других таких webapps, нет никакой разницы.

+1

Другие веб-приложения на одном сервере? .. Не так ли безопасно? – Mark

1

библиотеки сервера не имеют следующие преимущества:

  • Самое важное: нет конфликта версий между ядром сервера приложений и кода. Сервер Java EE должен предоставить некоторые классы API для вашего приложения по спецификации. Это не важно уже не дублирует эти классы внутри войны/уха
  • Уменьшить размер войны/ухо
  • Уменьшить потребление памяти сервера

Также это делает жизнь вспомогательной скважины, при переходе на новую версию приложения сервер. Например. если вы используете maven и wildfly, то Wildfly BOM предоставляет место централизации для информации о библиотеках.Вы можете отредактировать одну строку в maven pom при переключении на новую версию wildfly.

1

IMO экономия памяти не применяется. Раньше люди использовали несколько приложений на одном сервере приложений (AS). Если все они ссылаются на одну и ту же библиотеку, вы сохраняете память.

Но сейчас это безумие. Каждое приложение должно иметь свои собственные AS в любом случае только по соображениям безопасности (и предпочтительно в собственном экземпляре Docker).

Я бы посоветовал использовать библиотеки AS: их путь обновления не всегда совпадает с вашим (как разработчиком). Это может привести к неприятностям. Но со стороны ops это приятно для них из-за «стабильности» всего этого.

Моя рекомендация: отключите библиотеки AS и включите свои собственные. С JBoss это так просто, как это, например:

В WEB-INF файла папки JBoss-развертывания-structure.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> 
    <deployment> 
    <exclusions> 
     <module name="org.hibernate"/> 
      <module name="org.jboss.logmanager.log4j" /> 
      <module name="org.slf4j" /> 
      <module name="org.slf4j.impl" /> 
    </exclusions> 
    </deployment> 
</jboss-deployment-structure> 

свой спящий режим & каротаж. Вещи снова, как и должно быть.

Производитель AS хочет, чтобы вы реализовали свои библиотеки и код против их реализации, и, прежде чем вы это узнаете, вы состоите в браке с этой конкретной AS. Не обманывайте себя.

Только одно преимущество остается при использовании полного маршрута AS: уменьшенный размер войны. Вы можете сэкономить до 30 Мб. Я предполагаю, что это преимущество еще в 1999 году ..

+0

хорошо сказано. Многие отказываются от серверов приложений, поскольку многие из построенных им помещений и принципов неприменимы или перевешиваются другими проблемами. Самый большой недостаток дизайна - обновление вашего сервера приложений не должно нарушать ваше приложение. Когда вы используете библиотеки AS, обновление неизбежно нарушит ваше приложение. Я не могу сказать, сколько раз мне приходилось делать изменения приложений и специальные сборки для размещения этого AS и AS (даже младшие версии). Ошибки Javaasist и logger, ошибки библиотеки JSF/Hibernate и т. Д. Избегайте использования AS-библиотек как можно больше. – cyberoblivion

0

Для сервера 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 далеко, намного перевешивают любую потенциальную экономию памяти.

0

Основная причина, по которой я использую для библиотек приложений, - согласованность предприятия.

В компании у вас есть несколько команд для всех приложений для зданий, если все команды просто собирают файлы jar в свой военный файл, то они эффективно катают собственный сервер приложений. Это сжигает много ресурсов разработчика, поскольку они пытаются определить точные версии разных банок, которые работают хорошо вместе. Это также означает, что у меня тогда будет DevOps, поддерживающий кучу разных версий JPA, JMS Queue, Clustering, Caching и т. Д.

Если у меня есть команды, стандартизованные на сервере приложений, я знаю, что будет меньше сюрпризов в производстве. Я могу приобрести поддержку у поставщика приложений и знаю, что когда кеш не работает, есть один четкий способ его устранения.

Смежные вопросы