2009-06-26 3 views
1

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

Для развертывания этих приложений мы использовали 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 на сервере, если, например, нам нужно обновить ICE-файлы .jar до новой версии.

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

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

ответ

2

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

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

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

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

1

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

1

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

1

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

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

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


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

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