
Jetty – это легковесный HTTP-сервер и контейнер сервлетов для Java, который поддерживает спецификации Servlet, JSP и WebSocket. Он занимает минимальный объём памяти и позволяет запускать веб-приложения без необходимости полноценного контейнера типа Tomcat. Jetty подходит для интеграции как в крупные корпоративные проекты, так и в локальные приложения для тестирования.
Jetty часто используется для разработки микросервисов, где важна возможность быстро запускать отдельные модули без сложной настройки сервера. Благодаря встроенной поддержке асинхронной обработки запросов он справляется с высокой нагрузкой при минимальных задержках, что особенно важно для API и real-time сервисов.
Для запуска Jetty достаточно скачать дистрибутив с официального сайта и сконфигурировать порт в файле start.ini. Сервлеты можно разворачивать как в виде готового WAR-файла, так и напрямую через Java-код, создавая встроенный сервер. Настройка SSL и управление логами реализуются через XML-конфигурацию или программно, что облегчает интеграцию в существующую инфраструктуру.
Jetty поддерживает расширяемую архитектуру, позволяя подключать фильтры, слушатели и обработчики событий без изменения исходного кода сервера. Это делает его гибким инструментом для тестирования, прототипирования и развёртывания веб-приложений с различными требованиями к безопасности и производительности.
Установка Jetty и запуск первого веб-приложения

Скачайте последнюю стабильную версию Jetty с официального сайта https://www.eclipse.org/jetty/download.html. Для большинства проектов подходит дистрибутив jetty-distribution, включающий сервер, библиотеки и примеры конфигураций. Распакуйте архив в удобное место на диске и убедитесь, что установлен Java JDK версии 11 или выше.
Для запуска сервера откройте терминал в папке jetty-home и выполните команду java -jar start.jar. По умолчанию Jetty поднимает сервер на порту 8080, проверка доступности осуществляется через http://localhost:8080. Для изменения порта откройте файл start.ini и отредактируйте строку jetty.port=8080 на нужное значение.
Чтобы развернуть первое веб-приложение, создайте папку webapps в директории Jetty и поместите в неё WAR-файл приложения. Jetty автоматически подхватит приложение при старте сервера. Для встроенного подхода в Java-коде используйте Server и ServletContextHandler:
Server server = new Server(8080);
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath(«/app»);
server.setHandler(context);
server.start();
server.join();
Jetty поддерживает горячую перезагрузку изменений в WAR-файлах, что позволяет тестировать приложение без перезапуска сервера. Для ведения логов используйте конфигурацию logging.properties или подключение сторонних библиотек вроде Logback, чтобы отслеживать обращения к сервлетам и ошибки при старте.
Настройка портов и конфигурация сетевых соединений

Jetty позволяет гибко управлять портами и сетевыми интерфейсами, обеспечивая корректную работу серверов в разных средах. Основной порт задаётся в файле start.ini с помощью строки jetty.port=8080. Для использования нескольких портов создаются дополнительные Connector объекты.
Пример конфигурации нескольких портов в Java:
- HTTP-коннектор на порту 8080:
ServerConnector http = new ServerConnector(server); http.setPort(8080); server.addConnector(http);
- HTTPS-коннектор на порту 8443 с SSL:
SslContextFactory.Server ssl = new SslContextFactory.Server(); ssl.setKeyStorePath("/path/to/keystore"); ssl.setKeyStorePassword("password"); ServerConnector https = new ServerConnector(server, ssl); https.setPort(8443); server.addConnector(https);
Для ограничения соединений используется setIdleTimeout, задающий максимальное время бездействия, и setAcceptQueueSize, определяющий длину очереди подключений:
- http.setIdleTimeout(30000);
- http.setAcceptQueueSize(50);
Jetty поддерживает привязку к конкретному IP-адресу через setHost:
- http.setHost(«192.168.1.100»);
Для динамического изменения портов без редактирования start.ini рекомендуется создавать коннекторы программно в Java-коде и использовать конфигурационные файлы YAML или XML для централизованного управления настройками сетевых интерфейсов.
Развертывание сервлетов и веб-приложений на Jetty

Jetty поддерживает два подхода к развертыванию веб-приложений: через WAR-файлы и программное создание сервлетов в Java-коде. Для WAR-файлов достаточно разместить их в директории webapps, после чего Jetty автоматически развернёт приложение при старте сервера.
Для программного развертывания используйте ServletContextHandler и ServletHolder. Пример:
Server server = new Server(8080);
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath(«/myapp»);
ServletHolder servlet = new ServletHolder(new MyServlet());

context.addServlet(servlet, «/api/*»);
server.setHandler(context);
server.start();
server.join();
Для статических ресурсов создайте ResourceHandler и добавьте его в HandlerList:
ResourceHandler resources = new ResourceHandler();
resources.setDirectoriesListed(true);
resources.setResourceBase(«/path/to/static»);
HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[] { resources, context });
server.setHandler(handlers);
Jetty поддерживает горячее обновление приложений. Для этого можно включить HotDeployScanner, который отслеживает изменения в директории webapps и автоматически перезапускает приложения без остановки сервера.
Использование SSL и настройка защищённого соединения

Jetty предоставляет встроенную поддержку SSL через SslContextFactory.Server, позволяя настроить защищённое соединение по HTTPS. Для работы требуется ключевой магазин (keystore) с сертификатом, который можно создать командой:
keytool -genkey -alias jetty -keyalg RSA -keystore keystore.jks -keysize 2048
Пример создания HTTPS-коннектора в Java:
Server server = new Server();
SslContextFactory.Server sslContext = new SslContextFactory.Server();
sslContext.setKeyStorePath(«/path/to/keystore.jks»);
sslContext.setKeyStorePassword(«password»);
ServerConnector https = new ServerConnector(server, sslContext);
https.setPort(8443);
server.addConnector(https);
server.start();
Для удобства настройки можно использовать таблицу соответствия параметров:
| Параметр | Назначение | Пример значения |
|---|---|---|
| setKeyStorePath | Путь к keystore | /home/user/jetty/keystore.jks |
| setKeyStorePassword | Пароль keystore | password |
| setKeyManagerPassword | Пароль ключа внутри keystore | keypass |
| setTrustStorePath | Путь к truststore для проверки клиентских сертификатов | /home/user/jetty/truststore.jks |
| setTrustStorePassword | Пароль truststore | trustpass |
Для усиления безопасности рекомендуется включать только современные протоколы TLS и ограничивать список поддерживаемых шифров через методы setIncludeProtocols и setIncludeCipherSuites. Jetty также позволяет принудительно перенаправлять HTTP-запросы на HTTPS с помощью RewriteHandler.
Мониторинг состояния сервера и логирование запросов

Jetty поддерживает мониторинг через JMX, позволяя отслеживать состояние серверных компонентов, активные соединения и использование ресурсов. Для включения JMX добавьте jetty-jmx.jar в classpath и подключите MBeanContainer к серверу:
MBeanContainer mbContainer = new MBeanContainer(ManagementFactory.getPlatformMBeanServer());
server.addBean(mbContainer);
Для логирования HTTP-запросов используется RequestLog. Настройка через NCSARequestLog позволяет сохранять все обращения в формате, совместимом с веб-серверами:
NCSARequestLog requestLog = new NCSARequestLog(«/var/log/jetty/yyyy_mm_dd.request.log»);
requestLog.setAppend(true);
requestLog.setExtended(false);
RequestLogHandler logHandler = new RequestLogHandler();
logHandler.setRequestLog(requestLog);
HandlerCollection handlers = new HandlerCollection();
handlers.setHandlers(new Handler[] { logHandler, server.getHandler() });
server.setHandler(handlers);
Jetty позволяет разделять логи по контекстам приложений и настроить ротацию файлов через setRetainDays. Для анализа производительности можно использовать StatisticsHandler, который собирает данные о времени обработки запросов, количестве активных потоков и ошибках.
Встраивание Jetty в Java-приложение для локального сервера

Jetty можно встроить напрямую в Java-приложение, создавая локальный сервер без необходимости отдельного запуска. Для этого подключите зависимости jetty-server и jetty-servlet через Maven или Gradle.
Пример минимальной конфигурации встроенного сервера:
Server server = new Server(8080);
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath(«/»);
context.addServlet(new ServletHolder(new MyServlet()), «/api/*»);
server.setHandler(context);
server.start();
server.join();
Для обслуживания статических файлов добавьте ResourceHandler:
ResourceHandler resourceHandler = new ResourceHandler();
resourceHandler.setResourceBase(«src/main/resources/static»);
HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[]{resourceHandler, context});
server.setHandler(handlers);
Встроенный Jetty удобен для локального тестирования API, демонстрационных проектов и инструментов администрирования. Для управления жизненным циклом сервера используйте методы start(), stop() и join(), обеспечивая корректное завершение потоков и освобождение портов.
Вопрос-ответ:
Что такое Jetty и чем он отличается от других Java-серверов?
Jetty — это лёгкий HTTP-сервер и контейнер сервлетов для Java, поддерживающий спецификации Servlet, JSP и WebSocket. В отличие от более тяжёлых серверов типа Tomcat, Jetty занимает меньше памяти и быстрее запускается. Он подходит для встроенных решений, микросервисов и тестирования веб-приложений, позволяя разворачивать приложения без сложной конфигурации.
Как развернуть веб-приложение на Jetty?
Веб-приложения можно разворачивать через WAR-файл, помещённый в директорию webapps, либо программно в Java-коде с помощью ServletContextHandler и ServletHolder. Для статических ресурсов используется ResourceHandler. Jetty поддерживает горячую перезагрузку приложений, что позволяет тестировать изменения без перезапуска сервера.
Каким образом настроить защищённое соединение через SSL в Jetty?
Для настройки HTTPS создаётся объект SslContextFactory.Server с указанием пути к keystore и пароля. Создаётся ServerConnector с SSL, который добавляется к серверу. Для усиления безопасности рекомендуется включать современные протоколы TLS и ограничивать поддерживаемые шифры через методы setIncludeProtocols и setIncludeCipherSuites. Также можно настроить принудительное перенаправление HTTP на HTTPS.
Как контролировать состояние сервера и отслеживать запросы в Jetty?
Для мониторинга состояния используется JMX через MBeanContainer, позволяющий получать данные о соединениях, потоках и нагрузке. HTTP-запросы логируются с помощью RequestLog или NCSARequestLog, а StatisticsHandler собирает показатели времени обработки запросов и ошибок. Настройка ротации и разделения логов позволяет вести отдельные записи для каждого приложения.
