Расширение веб-приложений Java с помощью плагинов

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

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

Все модули должны быть отдельной единицей развертывания, в идеале - файлом war или jar.

Я попытался создать несколько обычных файлов войны, но Tomcat сохраняет (в соответствии со спецификацией сервлета) эти файлы войны полностью отдельно друг от друга, чтобы они, например, не могли делиться своими классами.

Мне нужны плагины, чтобы видеть «основной» путь к классам.

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

Я хотел бы сохранить полное разделение между самими плагинами (если они не указывают зависимости) и любыми другими несвязанными веб-приложениями, которые могут работать на том же Tomcat.

Я бы хотел, чтобы они имели root-права под префиксом URL-адреса "основного" приложения, но в этом нет необходимости.

Я хотел бы использовать Tomcat (большие архитектурные изменения необходимо согласовывать со слишком большим количеством людей), но также хотел бы услышать о чистом решении в мире EJB или OSGi, если оно есть.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
6
0
5 949
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Ответ принят как подходящий

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

Я и парень с моей работы тоже говорили об этом.

Konrad 04.10.2008 18:08

Кто-нибудь действительно сделал это успешно с osgi? Если да, то что бы вы посоветовали, как начать?

harmanjd 04.06.2009 20:01

На самом деле я работаю с командой, которая использовала OSGi для реализации уровня обслуживания приложения. Они использовали Apache Felix и встроили контейнер Jetty, чтобы предоставлять сервисы как веб-сервисы RESTful. Были проблемы из-за того, что Apache Felix не поддерживал полностью фрагменты до версии 1.8.

Brian Matthews 05.06.2009 13:27

Вы смотрели на использование maven для разделения ваших проектов, а затем на разрешение зависимостей между WAR и JAR? В итоге вы получите дублирование библиотек между WAR, но только там, где это необходимо (и это не должно быть проблемой, если вы не увлечетесь забавным загрузчиком классов).

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

Если вы хотите сохранить вещи в одном и том же веб-приложении (скажем, ROOT), вы можете создать прокси-веб-приложение, которое перенаправляется на соответствующее другое веб-приложение за кулисами для пользователя, чтобы сделать его относительно прозрачным?

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

В Tomcat WAR разделены отдельными загрузчиками классов, но они также разделены на уровне сеанса (каждое WAR является отдельным веб-приложением и имеет собственное состояние сеанса).

В Glassfish, если бы WAR были объединены в EAR, они бы совместно использовали загрузчики классов (GF использует пространство плоского загрузчика классов в EAR), но все равно имели бы отдельное состояние сеанса.

Кроме того, я не уверен, что вы можете выполнить «переадресацию» на другую WAR на сервере. Проблема в том, что пересылки используют относительный URL-адрес для корня веб-приложения, и каждое веб-приложение имеет свой собственный корень, поэтому вы просто «не можете добраться туда отсюда». Вы можете перенаправить, но это не то же самое, что и форвард.

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

Скорее, я думаю, что лучший совет - создать утилиту «ассемблер», которая берет ваши отдельные модули и «объединяет» их в одно веб-приложение. Он может объединять их web.xml, их содержимое, нормализовать jar-файлы и классы и т. д.

WAR - это особенность и ошибка в мире Java. Я люблю их, потому что они действительно делают развертывание скомпилированных приложений «перетаскиванием» с точки зрения их установки, и эта функция используется гораздо чаще, чем то, с чем вы сталкиваетесь. Но я чувствую твою боль. У нас есть общая «основная» структура, которую мы разделяем для всех приложений, и нам, по сути, приходится постоянно ее объединять, чтобы поддерживать ее. Мы написали сценарий, но это все еще немного неудобно.

«Кроме того, я не уверен, что вы можете выполнить« переадресацию »на другую WAR на сервере. Проблема в том, что пересылка использует относительный URL-адрес корня веб-приложения, и каждое веб-приложение имеет свой собственный корень, поэтому вы просто «не можете добраться отсюда». Вы можете перенаправить, но это не то же самое, что и переадресация ».

Вы можете перейти к другой WAR, если эта WAR позволяет кому-то это сделать.

Glassfish и несколько WAR-ов в EAR: в этом есть смысл.

Если вы поместите классы MAIN в общий CLASSPATH tomcat, вы можете поместить свои отдельные PLUGIN в отдельные файлы WAR.

Главное приложение также может быть частью сервлета TOMCAT, который вы определяете в server.xml. Это может быть ГЛАВНЫЙ СЕРВЛЕТ, а все другие WAR могут управляться этим главным сервлетом.

Имеет ли это смысл ?

BR,
~ А

В зависимости от сложности функциональности плагина я бы также рассмотрел веб-сервис, например, реализованный с помощью Axis.

Затем ваше основное приложение настраивается с URL-адресом веб-приложения (плагина), которое предоставляет услугу.

Преимущество, на мой взгляд, двоякое:

  • Вы получаете хороший, чистый, отлаживаемый API между двумя войнами, а именно: Мыло / XML-сообщения
  • Вы можете обновить один плагин без регрессионного тестирования вашего все приложение

Недостатки заключаются в том, что вам нужно создать несколько проектов Axis и что у вас должны быть некоторые своего рода конфигурация плагина. Кроме того, вам может потребоваться ограничить доступ к вашим услугам в Интернете. приложения, поэтому может потребоваться небольшая настройка.

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

Взгляните на портлеты Java - http://developers.sun.com/portalserver/reference/techart/jsr168/ - вкратце, спецификацию, которая обеспечивает взаимодействие между тем, что в противном случае является автономными веб-приложениями j2ee.

Редактировать Я забыл упомянуть, что портлеты в значительной степени независимы от фреймворка, поэтому вы можете использовать Spring для родительского приложения, а отдельные разработчики могут использовать все, что захотят, в своих портлетах.

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

Теперь, как вы сказали, предпочтительный способ сделать это с помощью файла WAR или JAR. Проблема с файлом WAR в том, что вы не можете развернуть его как плагин к существующему приложению. Tomcat развернет его как отдельный веб-контекст. Не желательно.

Другой вариант - создать файл JAR и написать некоторый собственный код, чтобы скопировать этот файл JAR в папку WEB-INF / lib и загрузить классы в существующий загрузчик классов. Проблема в том, как развертывать файлы, отличные от Java, такие как JSP или файлы конфигурации. Для этого есть два решения: a. Используйте шаблоны скорости вместо JSP (б.) Напишите некоторый собственный код для чтения JSP из пути к классам вместо пути контекста.

Модули OSGI или Spring Dynamic хороши, но в настоящее время они кажутся мне слишком сложными. Я разберусь с этим еще раз, если почувствую это.

Я ищу простой API, который может позаботиться о жизненном цикле плагина и по-прежнему может использовать JSP в моем упакованном файле JAR.

Возможно, вы можете использовать un jar плагин во время развертывания и копировать файлы в нужные каталоги.

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

Thilo 23.04.2009 05:22

На самом деле нет ничего лучше OSGI, если вы думаете о разделении приложения на отдельные модули. Взгляните на пример Greenpages. Вы можете создать родительский модуль (ядро), в который вы будете включать jar-файлы, необходимые вашему приложению.

Если вы что-то знаете о программировании компонентов, вы скоро обнаружите, что модули OSGI ведут себя как интерфейсы, где вам нужно раскрыть то, что вы будете использовать в других модулях. Это довольно просто, если вы поймете. В любом случае это также может быть очень болезненным, когда вы узнаете, как использовать OSGI. У нас были проблемы с использованием JSON, поскольку версия Jackson, которую мы добавили в качестве jar-файла в модуль, была переопределена другим jar-файлом, который содержался в основных модулях Spring. Вам всегда нужно дважды проверять, какая версия jar загружена для ваших нужд.

К сожалению, даже подход OSGI не решает то, что мы ищем. Как расширить постоянную модель и существующие формы во время выполнения.

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