Горячее развертывание контекстов сервлетов, загруженных из пути к классам?

У меня есть следующая встроенная установка Jetty:

    ServletContextHandler topHandler = new ServletContextHandler(server, contextPath);

    // Set path of static resources
    topHandler.setBaseResource(...);

    // Bind dynamic content to /api
    RootResource rootResource = new RootResource();
    FilterHolder restApiHandler = new FilterHolder(rootResource);
    for (Entry<String, String> parameter : initParams.entrySet())
        restApiHandler.setInitParameter(parameter.getKey(), parameter.getValue());
    topHandler.addFilter(restApiHandler, "/api/*", EnumSet.allOf(DispatcherType.class));

    // Bind static content to /
    ServletHolder staticResourceHandler = topHandler.addServlet(DefaultServlet.class, "/");

    server.start();

И я нашел документацию по горячему развертыванию на https://www.eclipse.org/jetty/documentation/9.4.19.v20190610/hot-deployment.html, но я не понимаю, как их собрать.

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


person Gili    schedule 31.07.2019    source источник


Ответы (1)


Горячее развертывание обычно является функцией концепции WebAppContext и WAR, которая предоставляет изолированные загрузчики классов.

ServletContextHandler потребуется специальный загрузчик классов, чтобы имитировать поведение изолированного загрузчика классов, которое предоставляет WebAppContext.

Горячее развертывание - это функция DeploymentManager и связанного с ним AppProvider, которая выполняет сканирование для обнаружения изменений (например, в файловой системе).

Вам понадобится DeploymentManager в качестве фасоли на вашем Server.

И вы захотите выбрать AppProvider (например, WebAppProvider), чтобы отслеживать изменения в каталоге и запускать новые обновления приложений обратно в DeploymentManager.

Затем вам нужно, чтобы ваш ServletContextHandler был полностью объявлен в развернутом формате XML в этом отслеживаемом каталоге.

Классы, которые вы изменяете, должны быть откуда-то, что НЕ ЯВЛЯЕТСЯ частью Server ClassLoader.

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

В совокупности это то, что вы ищете для горячего развертывания.

person Joakim Erdfelt    schedule 31.07.2019
comment
У вас есть образец кода, который выполняет горячее развертывание для WebAppContext? Я вижу github.com/jetty-project/embedded-jetty-cookbook/blob/master/ и github.com/jetty-project/embedded-jetty-cookbook/blob/master / а вот как связать их между собой непонятно. Кроме того, должен ли ServletContextHandler быть объявлен в развернутом формате XML, если мне не нужно повторно развертывать его при изменении его конфигурации? Мне нужно только повторно развернуть, если сервлеты меняются. - person Gili; 31.07.2019