Как добавить функцию модульности в веб-приложение Java

Я разработал веб-приложение на основе Java EE как проект с открытым исходным кодом.

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

Можете ли вы объяснить, как этого добиться или направить меня к источнику ссылки.

Ответ 1

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

Что решает OSGi?

Проблемы с пониманием всей экосистемы OSGi Web

В руководстве " Введение в OSGi" используются Apache Felix и Apache Karaf, и оно дает, казалось бы, простое руководство по созданию пакетов услуг. Из учебника:

Open Service Gateway Initiative - это спецификация, определяющая компонентную систему на основе Java. В настоящее время им управляет OSGi Alliance, а его первая версия датируется 1999 годом. С тех пор он зарекомендовал себя как отличный стандарт для компонентных систем и широко используется в настоящее время. Например, Eclipse IDE является приложением на основе OSGi.

По-видимому, более сложным учебным пособием может быть OSGi Modularity - Tutorial

ServiceLoader предоставляет A simple service-provider loading facility. но выглядит упрощенно для ваших нужд. Он работает для весенней загрузки, но, похоже, не предназначен для корпоративных приложений. Простой пример этого так:

Framework вашего приложения:

public class FrameworkClass {    
    public static void main(String[] args) {
        new FrameworkClass().run();
    }
    private void run() {
        ServiceLoader<IFrameworkModule> modules = ServiceLoader.load(IFrameworkModule.class);
        modules.forEach(IFrameworkModule::initialize);
        modules.forEach(IFrameworkModule::execute);
    }
}

Интерфейс, который реализуют сервисные модули:

public interface IFrameworkModule {
    public void initialize();
    public void execute();
}

Модуль - в отдельной банке - для приложения

public class Module1 implements IFrameworkModule {
    @Override
    public void initialize() {
        System.out.println("initialize module1");
    }

    @Override
    public void execute() {
        System.out.println("execute module1");
    }
}

которому нужен файл framework.IFrameworkModule папке META-INF/services

fmodule.Module1

Но учитывая сложность вашего приложения, я думаю, что имеет больше смысла использовать OSGi.

Ответ 2

У меня была похожая задача с моим проектом ioc-unit. Я хотел, чтобы пользователь добавил возможность тестирования Mockito-объектов, Rest-Services или Ejb-Services независимо от базового алгоритма и включал только те возможности, которые необходимы.

Принципы, которые я использовал, определены в интерфейсе поставщика услуг оракулом (Java).

Поэтому я определил сервис-интерфейс, который реализован и определен в META-INF/services модулями, которые следует гибко добавлять. Пример для этого: ioc-unit-resteasy для тестирования rest-webservices или ioc-unit-mockseasy для введения mockito mocks в cdi-tests.

Затем текущая конфигурация распознается с помощью config-finder. Этот искатель сможет вызывать все интерфейсы всех модулей (jar), которые включены в ваш развертываемый. В случае ioc-unit анализатор использует интерфейс для особой интерпретации найденных классов. Если включен ioc-unit-ejb, то аннотации Ejb распознаются, если ioc-unit-mockeasy, @Mock распознается, если ioc-unit-resteasy: @Path и @Provider.....