Вопрос

Я работаю с очень большими приложениями JSF / Facelets, которые используют пружину для управления Di / Bean. Мои приложения имеют модульную структуру, и я в настоящее время ищу подходы к стандартизации модуляризации.

Моя цель состоит в том, чтобы составить веб-приложение из ряда модулей (возможно, в зависимости друг от друга). Каждый модуль может содержать следующее:

  • Классы;
  • Статические ресурсы (изображения, CSS, скрипты);
  • Шаблоны из бокалов;
  • Управляемые бобы - контексты приложения Spring, с запросом, сеансом и нанесением на уровне приложений (альтернатива ISF управляемых бобов);
  • API сервлета - сервлеты, фильтры, слушатели (это необязательно).

То, что я хотел бы избежать (почти во всех расходах) - это необходимость копирования или извлечения ресурсов модулей (например, шаблоны Facelets) на войну или продление web.xml Для сервлетов модуля, фильтров и т. Д. Достаточно добавить модуль (JAR, Bundle, Artifact, ...) в веб-приложение (WEB-INF/lib, bundles, plugins, ...) Чтобы продлить веб-приложение с помощью этого модуля.

В настоящее время я решу эту задачу с пользовательским решением модуляризации, который сильно на основе использования ресурсов классов:

  • Специальные ресурсы обслуживают статические ресурсы от ресурсов классов (банки).
  • Специальные фасадные ресурсы Resolver обеспечивают загрузку шаблонов корпусов из ресурсов классов.
  • Весенние загрузки приложения контексты через рисунок classpath*:com/acme/foo/module/applicationContext.xml - Это загружает контексты приложений, определенные в модульных банках.
  • Наконец, пара делегирующих сервлетов и фильтров делегируют обработку запроса на сервлеты и фильтры, настроенные весной контексты приложения из модулей.

В последние дни я много читал о Осги, и я рассматриваю, как (и если) я мог бы использовать OSGI как стандартизированный подход модуляризации. Я думал о том, как индивидуальные задачи могут быть решены с ОСГИ:

  • Статические ресурсы - Осги Ударные пучки, которые хотят экспортировать статические ресурсы, регистрируют ResourceLoader экземпляры с контекстом расслоения. Центральный ResourceServlet Использует эти ресурсные погрузчики для загрузки ресурсов из пучков.
  • Шаблоны из корпусов - аналогичные выше, центральное ResourceResolver использует услуги, зарегистрированные с помощью пучков.
  • Управляемые бобы - Не имею представления Как использовать выражение, как #{myBean.property} если myBean определяется в одном из пучков.
  • API сервлета - используйте что-то вроде Webextender / Pax Web для регистрации сервлетов, фильтров и так далее.

Мои вопросы:

  • Я изобрел велосипед здесь? Есть ли стандартные решения для этого? Я обнаружил упоминание о весенних ломтиках, но не смог найти много документации об этом.
  • Как вы думаете, OSGI - это правильная технология для описанной задачи?
  • Мой эскиз приложения OSGI более или менее правильный?
  • Как управлять Beans (особенно запрос / область сеанса) будет обрабатываться?

Я был бы, как правило, благодарен за ваши комментарии.

Это было полезно?

Решение

Что вы стремитесь делать звуки выполнения, с несколькими предостережениями:

Слой вид: Во-первых, ваш просмотр слой звучит немного превзошествителен. Существуют и другие способы модуляции компонентов JSF с помощью пользовательских компонентов, которые позволят избежать головных болей, связанных с попыткой создать что-то столь же драматично, как с опознанием боб.

Сами модули: Во-вторых, ваши модули не кажутся особенно модульными. Ваш первый список Bullet делает его звуком так, как будто вы пытаетесь создать совместимые веб-приложения, а не модули как SE. Моя идея модуля состоит в том, что каждый компонент имеет четко определенную, и более или менее дискретный, цель. Например как бывший лежит в основе VI.. Отказ Если вы идете вниз по маршруту ОСГИ, то мы должны определить модульную, как это: Модульная, ради этого обсуждения, означает, что компоненты горячие сбой - то есть они могут быть добавлены и удален не нарушая приложение.

Зависимости: Я немного обеспокоен вашим описанием модулей как «возможно, в зависимости от друг друга». Вы, вероятно, (я надеюсь) уже знаете это, но ваши зависимости должны образовывать направленный ациклический график. После того, как вы ввели круговую зависимость, вы просите мир больно с точки зрения возможной ремонтопригодности приложения. Одна из самых больших слабостей Осги - это то, что это нет Предотвратить циркулярные зависимости, поэтому вам необходимо обеспечить его применение. В противном случае ваши зависимости будут расти как Кудзу и постепенно заслонки остальной экосистемы вашей системы.

Серлетлы: Fuhgeddaboudit. Вы не можете поздно связывать сервлеты в веб-приложение, а пока сервлет 3.0 Spec не находится в производстве (как указал Паскаль). Чтобы запустить отдельный утилитный сервлет, вам нужно будет поместить его в свое приложение.


Хорошо, так много для предостережений. Давайте подумаем о том, как это может работать:

Вы определили свой собственный модуль JSF, чтобы сделать ... Что именно? Давайте дадим его определенную, довольно тривиальную цель: экран входа в систему. Итак, вы создаете свой экран входа в систему, поздно - свяжите его с помощью OSGI в ваше приложение и ... тогда что? Как приложение знает функциональность входа в систему, если вы еще не определили его на странице .jspx? Как приложение знает, чтобы перейти к чему-то, что он не может знать, есть ли там?

Есть способы обойти это с помощью условного включения и тому подобное (например, <c:if #{loginBean.notEmpty}>), но, как вы сказали, все становится немного волосаты, когда ваш управляемый Bognbean существует в другом модуле, который, возможно, даже не был представлен в приложение. Фактически, вы получите исключение сервлета, если не существует этого входа в систему. Ну так что ты делаешь?

Вы определяете API в одном из ваших модулей. Все управляемые бобы, которые вы собираетесь поделиться между модулями, должны быть указаны в виде интерфейсов в этом слое API. И все ваши модули должны иметь реализования по умолчанию любой из этих интерфейсов, которые они намерены использовать. И эта API должна быть разделена между всеми совместимыми модулями. Затем вы можете использовать OSGI и пружину для провода вместе указанные бобы с их реализацией.

Мне нужно занять момент, чтобы указать, что это не то, как я бы подошел к этой проблеме. Нисколько. Учитывая что-то вроде как простое в качестве входа в систему, или даже как сложная как акционер, я бы лично предпочел создать пользовательский компонент JSF. Но если требование: «Я хочу, чтобы мои удаленные бобы были модульными (то есть, горячие сбой, и т. Д.),« Это единственный способ, которым я знаю, чтобы он работал. И я даже не совсем уверен буду работай. Эта электронная почта обмена Предполагается, что это проблема, на которой разработчики JSF только начали работать.

Я обычно считаю, что управляемые бобы являются частью просмотра слоя, и как таковой я использую их только для логики просмотра, и делегировать все остальное на сервисный слой. Управляя управляемой бобы поздним связыванием, на мой взгляд, продвигая их из слоя вида и в бизнес логику. Есть причина, по которой все эти учебные пособия настолько ориентированы на услуги: потому что большую часть времени вы хотите подумать о том, что потребуется для вашего приложения, чтобы запустить «без головы», и насколько легко было бы «кожу» ваше представление, для Экземпляр, вы хотели его запустить, со всей его функциональностью на телефоне Android.

Но звучит как много того, что вы работаете, является сама по себе логика - например, необходимость поменять в другой шаблон просмотра. Осги / Весна должна быть в состоянии помочь, но вам понадобится что-то в вашем приложении, чтобы выбрать между доступными реализациями: в значительной степени то, что создан реестр услуг ОСГИ.

Это оставляет статические ресурсы. Вы можете модулировать их, но помните, что вам нужно будет определить интерфейс для получения этих ресурсов, и вам нужно будет предоставить реализацию по умолчанию, чтобы ваше приложение не задыхается, если они отсутствуют. Если I18N является рассмотрением, это может быть хороший способ пойти. Если вы хотели быть В самом деле Авантюрный, тогда вы можете подтолкнуть ваши статические ресурсы в JNDI. Это сделало бы их полностью горячими сменными и сэкономить вам боль в попытке решить, какую реализацию в использовании программно, но есть некоторые недостатки: любой неудачный поиск приведет к тому, что ваше приложение заставляет ваше приложение бросать NamingException. И это излишки. JNDI обычно используется в веб-приложениях для конфигурации приложения.

Что касается ваших оставшихся вопросов:

Я изобрел велосипед здесь? Есть ли стандартные решения для этого?

Вы немного. Я видел приложения, которые делают это Добрый Дело, но вы, кажется, наткнулись в довольно уникальный набор требований.

Как вы думаете, OSGI - это правильная технология для описанной задачи?

Если вам нужны модули, чтобы быть горячим сбой, то ваш выбор - это OSGI и весовой интерфейс сервивелок.

Мой эскиз приложения OSGI более или менее правильный?

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

Но не принимайте мое слово для этого. я нашел разное Материал чтения в этих местах.

И так как вы спрашиваете о весенних ломтиках, Это должно быть достаточно, чтобы вы начали. Отказ Вам понадобится Git Client, и похоже, вы будете тренировать себя в приложении, просматривая исходный код. И это очень ранний код прототипа.

Другие советы

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

  1. Нет хорошо интегрированного решения между веб-контейнером и платформой OSGI.
  2. OSGI может быть слишком много для пользовательского веб-приложения Build, которое просто ищет простую модульную архитектуру. Я бы рассмотрел ОСГИ, если мой проект должен поддерживать третьинные расширения, которые находятся не на 100% под нашим контролем, если проект нуждается в горячем перерасплетении, строгие правила доступа между плагинами и т. Д.

Пользовательское решение на основе классовых погрузчиков и фильтров ресурсов, кажется, очень подходит для меня. В качестве примера вы можете изучить HUDSON Исходный код или Java Plug in Framework (JPF) проект (http://jpf.sourceforge.net/).

Как о расширении Web.xml, нам может повезть с спецификацией сервлета 3.0 (http://today.java.net/pub/a/today/2008/10/14/introduction-to-servlet-3.html# подключаемость и расширяемость).

«Фрагмент дескриптора развертывания веб-модуля» (AKA Web-Fragment.xml), представленный Спецификация сервлета 3.0 было бы хорошо здесь. Спецификация определяет это как:

Веб-фрагмент - это логическое разбиение веб-приложения, таким образом, что фреймы, используемые в веб-приложении, могут определить все артефакты, не просив devlopers редактировать или добавлять информацию в web.xml.

Java EE 6, может быть, не вариант для вас прямо сейчас. Тем не менее, это будет стандартизированное решение.

Предприятие OSGI - довольно новый домен, поэтому не думаю, что вы получите решение, которое напрямую удовлетворяет вашу потребность. То, что сказал, что одна из вещей, которые я нашел отсутствующим от Equinox (двигатель OSGI за Eclipse и, следовательно, один с наибольшей базой пользователя!) - это последовательная конфигурация / ди В моем проекте недавно у нас были некоторые подобные потребности и заканчивались созданием простой конфигурации OSGI Service.

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

Помимо конфигурации, вы можете взглянуть на недавно опубликованную книгу Equinox для руководства по использованию OSGI в качестве базы для создания модульных приложений. Примеры могут быть специфическими для равновесие, но принципы будут работать с любыми структурами ОСГИ. Связь - http://equinoxosgi.org/

Вы должны посмотреть на Spring DM Server (переходит в Eclipse Virgo, но это еще не было выпущено). В недавнем спецификации ОСГИ много хороших вещей есть много хороших вещей, которое также было выпущено.

Некоторые из весенских учебных пособий DM помогут, я представлял бы представить. Но да, можно иметь как ресурсы, так и классы, загруженные из-за пределов веб-пакета с использованием стандартной модульности. В этом это хорошая подгонка.

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

Вы также можете посмотреть, чтобы иметь один веб-пакет, а затем использовать, например, реестр расширения Eclipse для расширения возможностей вашего веб-приложения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top