Совместное использование файлов Java EE Jar - PullRequest
1 голос
/ 27 июня 2009

В нашем магазине мы поддерживаем около 20 веб-приложений Java EE. Большинство этих приложений в своей архитектуре довольно CRUD-подобны, а некоторые из них являются приложениями для вычислений, требующих значительных ресурсов процессора.

Для развертывания этих приложений мы использовали Hudson, настроенный для мониторинга нашего хранилища CVS. Когда у нас будет регистрация, проекты будут скомпилированы и развернуты на нашем сервере Tomcat 6.0 ( Solaris 10, двухъядерный процессор Sparc с частотой 1,6 ГГц, 2 ГБ ОЗУ ... не самая мощная машина на всех этапах. воображения ... ) и, если существуют какие-либо юнит-тесты для проекта, они выполняются, и проект развертывается только в случае прохождения юнит-тестов. Это прекрасно работает.

Теперь со временем я заметил, что во многих создаваемых мною проектах снова и снова используются одни и те же файлы .jar (Hibernate, POI (вывод в Excel), драйвер JDBC для SQL Server, JSF, ICEFaces, бизнес. логические файлы .jar и т. д.). Наша практика состояла в том, чтобы просто сохранить папку на нашем сетевом диске со всеми используемыми по умолчанию файлами .jar, которые мы использовали, и при запуске нового проекта мы копируем этот набор файлов .jar в новый проект и идем оттуда. ... и я чувствую себя таким грязным каждый раз, когда это случается, это начинает держать меня ночью. Мои коллеги сказали мне, что «чрезвычайно сложно» создать репозиторий .jar на сервере tomcat, который я не покупаю ни на секунду ... Я приписываю это чистой лени и, возможно, нет желания изучать лучшие практики. Я могу ошибаться, однако, я просто излагаю свои чувства по этому вопросу. Похоже, это увеличивает размер наших .war-файлов, которые также развертываются на сервере.

Насколько я понимаю, сам Tomcat имеет набор файлов .jar, которые доступны всем развернутым в нем приложениям, поэтому я думаю, что мы сможем объединить все эти дубликаты файлов .jar во всех наших проектах и ​​переместить их. на сервер Tomcat. Для этого потребуется обновить только один файл .jar на сервере, если, например, нам нужно обновить файлы .jar ICEFaces до новой версии.

Другая часть меня говорит, что, включив только одну копию файлов .jar на сервере, мне может понадобиться сохранить копию каталога lib сервера в моей среде разработки (т.е. включить эти файлы .jar в eclipse зависимость).

Мой инстинкт инстинктивности говорит мне, что я хочу переместить эти дубликаты .jar-файлов на сервер ... будет ли это работать?

Ответы [ 4 ]

2 голосов
/ 27 июня 2009

Я думаю, что Maven и Ivy были рождены, чтобы помочь управлять зависимостями JAR. Может быть, вы найдете, что они полезны.

Что касается дискуссии о дублировании JAR-файлов в каждом проекте по сравнению с их размещением на сервере / lib, я думаю, что это зависит от одного момента: насколько вероятно, что вы захотите обновить каждое приложение, развернутое на Tomcat, в в то же время? Можете ли вы представить себе время, когда на этом сервере могут работать N приложений, а (N + 1) -ому приложению может потребоваться или требовать более новую версию конкретного JAR-файла?

Если вы не возражаете против синхронизации всех приложений, пусть они используют общую библиотечную базу.

Лично я считаю, что дисковое пространство дешево. Я предпочитаю дублировать JAR-файлы для каждого приложения и помещать их в WAR-файл. Мне нравится разделение. Я бы хотел увидеть больше, когда OSGi станет более популярным.

1 голос
/ 27 июня 2009

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

Пусть они живут в WEB-INF / lib, чтобы ваши войны были самодостаточными (вы будете рады, что однажды сделали это).

То, что вы могли бы рассмотреть, - это использовать maven или Ant Ivy для извлечения библиотечных банок из общего хранилища. Это очень полезно и не должно быть проблемой в вашем сценарии.


Редактировать: Заметным исключением является библиотека Metro - слой веб-сервиса от Glassfish - который должен находиться в веб-контейнере, а не в веб-приложении.

1 голос
/ 27 июня 2009

Я действительно не думаю, что помещать библиотеки в общий / lib - хорошая идея. Идея использования военных файлов в качестве приложений в контейнере сервлетов заключается в том, чтобы иметь реальное представление об изоляции между вашими веб-приложениями. Вы можете столкнуться с ошибками, такими как развертывание какой-либо сторонней WAR (с собственными библиотеками внутри WEB-INF / lib), и она ведет себя неожиданно, потому что загружает другую версию одной из этих библиотек из общей (помните, что обычное поведение для классов загрузки сначала посмотрите на общий загрузчик классов, а если вы не найдете класс, найдите тот, который предназначен для вашего веб-приложения). Даже не упоминайте, насколько болезненным может быть перемещение какого-либо приложения в другой контейнер сервлета или на сервер приложений. Как упоминалось ранее, вы можете использовать maven для работы с jar-зависимостями, и если вам нравится однородное использование библиотек, определите родительский POM (maven jargon) во всех ваших приложениях.

1 голос
/ 27 июня 2009

Это работает большую часть времени, но вы можете попасть в досадные ситуации, когда jar, который вы переместили в tomcat, пытается создать экземпляр класса в одном из jar-файлов вашего веб-приложения, что приводит к выбросу ClassNotFoundException. Я делал это раньше, но остановился из-за этих проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...