eclipse jetty что это

About Jetty

Where has Jetty called home?

The Jetty project has found its home in many places over the last 20+ years.

Eclipse and Github

In 2009, the Jetty project moved its core components to be a project of the Eclipse Foundation, in order to improve the IP processes and broaden the licensing and community of the project. As of Jetty 9 the project has fully moved to the Eclipse Foundation. Additionally, in 2016 the project moved the canonical source and issue repository to Github.

Codehaus

In 2005, the jetty project moved to the The Codehaus for its hosting services and open source community. In 2009, after the core components of Jetty moved to Eclipse, the Jetty @ codehaus project continued to provide integrations, extensions and packaging of Jetty.

Sourceforge

From 2000 to 2005, the Jetty project was hosted at sourceforge.net where versions 3.x, 4.x and 5.x were produced.

Who has funded development of Jetty?

The development of the Jetty project has been fully funded over the years through close collaboration with a great many wonderful clients. Support has been organized through the entities as mentioned below over the years.

Webtide

In 2015 the development of Jetty was once more taken over by Webtide when the developers split away from Intalio, taking full ownership of the company behind the open source project. Webtide now fully funds the ongoing development of the Jetty project through services and support on the open source version of the Jetty project.

Intalio

The role of the development of Jetty was taken over in 2009 by Intalio, Inc., who acquired both Webtide and Mort Bay. Intalio was a company that offered both products and services based on open source software and they employed many of the jetty developers and contributors in addition to other open source and closed source platforms.

Webtide

The role of leading the development of Jetty was taken over in 2006 by Webtide LLC, formed as a joint venture between Mort Bay and partners providing marketing, sales and strategic assistance to the open source project.

Источник

Встраиваем Jetty-сервер в свой проект

Канал в Telegram

Встраиваем Jetty-сервер в свой проект

Автор Алексей Кутепов

Дата публикации 29.09.2016

В этой статье я расскажу от такой крутой вещи, как Jetty сервер! Почему Jetty крутой и чем он может быть полезен сферическому java-программисту в вакууме? Всё дело в том что Jetty является одновременно легковесным и хорошо оптимизированным решением, которое можно использовать как в небольших, так и в крупных проектах. Jetty хорошо масштабируется, экономично использует память, но самый жир это то что его можно встроить в своё приложение. Это дико удобно когда нужно отладить работу веб-приложения, так как отпадает необходимость постоянно его пересобирать и заливать на сервер приложений. Да и вообще встроенный сервер может решать кучу полезных задач, например недавно мне понадобилось сделать легковесное веб-приложение со встроенным сервером, которое можно было бы запускать одной командой на любой машине, и для решения этой задачи я использовал Jetty.

Сейчас на простом примере я покажу как можно встроить Jetty сервер в своё приложение. Кроме этого, добавлю ещё пару интересных и полезных фишек:

Посвящать этим двум фишкам отдельную статью смысла нет, тем более что в данном примере они будут смотреться очень уместно. Теперь перейдём к разработке:

Для начала создайте веб-приложение в своей любимой IDE (я предпочитаю IDEA IntelliJ) или с помощью команды:

В результате этих манипуляций должен сгенерироваться проект вот с такой структурой:

Затем надо добавить в файл pom.xml все зависимости, которые будут нужны для дальнейшей работы. Для наглядности я решил прикрутить к проекту Spring MVC:

Ну и конечно же зависимости для Jetty:

Версии зависимостей я вынес в отдельный блок для красоты:

Кроме этого, нам потребуются три Maven-плагина, которые так же нужно добавить в pom.xml:

maven-compiler-plugin отвечает за версию Java, которая используется при сборке проекта.

maven-dependency-plugin собирает все зависимости в папку lib и помещает её в каталог рядом с jar-файлом.

Ещё необходимо задать папку ресурсов и указать местоположение внешнего файла с настройками приложения:

В итоге должен получиться вот такой pom.xml:

С зависимостями разобрались, продолжаем дальше конфигурировать наше приложение. В папке /src/main/webapp/WEB-INF должен лежать файл web.xml. Если он ещё там не лежит, то его нужно немедленно создать:

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

Обратите внимание что в init-param мы указали местоположение конфига для Spring, поэтому создайте файл beans.xml в папке /src/main/webapp/WEB-INF/ со следующим содержимым:

В property-placeholder я указал расположение внешнего файла конфига app.properties, затем с помощью component-scan инициализирую все классы из пакета ru.kutepov с аннотацией @Component. В конце инициализирую InternalResourceViewResolver, который отвечает за отображение .jsp страницы.

Теперь откройте файл index.jsp, который располагается в папке /src/main/webapp/WEB-INF/pages/ и вставьте туда такой код:

Читайте также:  субарахноидальное кровоизлияние головного мозга что это такое и последствия

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

Создайте в папке /src/main/webapp/resources/properties/ файл app.properties и добавьте туда строку:

Затем создайте в папке /src/main/java пакет ru.kutepov.controller и добавьте в него класс MainController.java:

Завершающим этапом будет создание загрузчика, который будет запускать jetty-сервер. добавьте в пакет ru.kutepov пакет launcher и создайте в нём класс Launcher.java:

Данный загрузчик запускает jetty-сервер на порту 12135 по умолчанию, либо на том порту, который был передан в качестве аргумента командной строки. Рассмотрим код подробнее:

Далее создаём класс сервера (Server) и передаём этого ему номер порта.

В начале я получаю объект класса ProtectionDomain, который содержит в себе все характеристики домена. У ProtectionDomain есть замечательный метод getCodeSource(), который возвращает объект класса CodeSource. Класс CodeSource содержит в себе информацию о расположении ресурса (URL ресурса или ссылка на локальный ресурс), а так же информацию о цепочки сертификатов, которые использовались, чтобы проверить подписанный код, происходящий из того расположения. Чтобы получить информацию о расположении ресурсов, я вызываю метод getLocation() объекта класса CodeSource и получаю объект URL, который как раз содержит то что нужно. Так как в WebAppContext необходимо передать путь в виде строки, вызываем метод toExternalForm() объекта класса URL и передаём полученную строку в метод setWar() объекта класса WebAppContext.

В конце передаём готовый объект класса WebAppContext в метод setHandler()объекта класса Server и запускаем наш сервер.

Всё, приложение готово! Соберите проект командой:

Перейдите в сгенерированный каталог /target и выполните команду:

или если хотите запустить приложение ну другом порту, то команду:

Источник

Быстрая разработка веб-приложений на Java

Как вы разрабатываете веб-приложение на Java?
После каждого изменения, как вы его запускаете и проверяете? Сколько времени занимает редеплой приложения и рестарт контейнера?

Мне довелось видеть разные варианты: от полной пересборки WAR-файла до использования плагинов для IDE типа MyEclipse, WTP и «коннекторов» для сервлет-контерйнеров. У некоторых из них есть явные недостатки, другие вполне работают — но есть способ проще!

Запускалка

Этот способ разработки позволяет максимально просто и гибко настроить приложение с минимальным временем редеплоя. Вам надо всего лишь написать один простенький Java-класс с main-методом, который запустит сервер Jetty сразу с нужными приложениями (т.н. Embedded Mode).

Вот как выглядит запускалка в минимальной комплектации:

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

Вот и вся хитрость.
Наверняка в продакшине вы используете не Jetty, а что-нибудь типа Tomcat, JBoss или WebLogic. Неважно, мы ведь сейчас говорим о разработке, где скорость, стабильность и т.д. неважны, а важна лёгкость настройки, скорость запуска и редеплоя. И тут Embedded Jetty — то, что доктор прописал.

Вы можете просто запускать этот main-класс из своей любимой IDE, отлаживать, тестировать, рестартовать; и не нужны никакие плагины, не нужно искать файлы конфигурации, не нужно копаться в XML’ах. Все настройки под рукой. Вот это жизнь!

Для запускали в минимальной комплектации достаточно всего трёх jar-файлов: servlet-api.jar, jetty.jar, jetty-util.jar.

[UPD] Как подсказывает kblcuk, приведённый код запускалки работает только для версии Jetty 6. Начиная с седьмой версии Jetty, названия пакетов и классов были поменяны с org.mortbay.jetty.* на org.eclipse.jetty.*, так что придётся подправить import.

Тюнинг

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

Загрузчики классов

Приведённый выше код загружает классы и зависимости всех веб-приложений в одном загрузчике (ClassLoader). Если по какой-то причине вам важно, чтобы у веб-приложений были разные наборы классов и зависимостей (jar’ов), это тоже можно сделать, дописав немножко кода:

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

Старожилы помнят, что в незабвенные времена для формирования HTML часто использовалась такая штука, как JSP. Если в вашем проекте JSP тоже используется, то придётся добавить ещё несколько зависимостей: eclipse-jdtcore.jar, jsp-api-2.1-glassfish.jar, jsp-2.1-glassfish.jar

Конфигурация JDBC-ресурсов

Возможно, есть решение попроще, но вот такой вариант у меня заработал:

Нельзя ли это ещё немножко автоматизировать?

Можно. Но только если нужно.
Если адрес или пароль базы данных у вас часто меняется, возможно, вы захотите считывать их из какого-нибудь файла. Это можно. Но стоит ли? Главное, что все настройки сосредоточены в одном файле, а что это за файл — java-класс или *.properties — не всё ли равно?

Если список веб-приложений постоянно меняется, возможно, имеет смысл написать плагин для Eclipse или IDEA, который бы запускал Jetty со всеми проектами, которые есть в данный момент в Eclipse. Один такой плагин описан здесь — он находит все проекты, в которых есть файл web.xml, а остальные проекты добавляет к ним в classpath.

Минусы

Альтернативы

Остаётся добавить, что в embedded режиме можно запускать не только Jetty, но и Tomcat, Glassfish и др. Конкретный контейнер неважен, важен принцип: никакой длительной пересборки, установки, распаковки и настройки. Всё запускается быстро и просто из одного класса.

Читайте также:  что делать если йорка укусила пчела

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

Источник

Простая веб-служба со встроенным Jetty

Развитие информационных технологий все более и более вовлекает использование инфраструктуры Интернет. Распределенные и мобильные приложения все чаще используют обмен информацией по протоколу HTTP. При этом архитектура Клиент-Сервер остается самой распространённой и простой для освоения, создания и эксплуатации. Принцип архитектуры Клиент-Сервер прост — сервер предоставляет ресурс, а клиент использует этот ресурс.

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

Задача

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

Пример запроса/ответа — сумма

Пример запроса/ответа — разность

Пример запроса/ответа — произведение

Пример запроса/ответа — частное

Пример запроса/ответа – ошибка «деление на 0»

Пример запроса/ответа – ошибка «неверный формат числа»

Установка библиотек Jetty

Jetty очень удобен для создания веб приложений. Использование его как встроенного сервера освобождает разработчика от развёртывания веб приложения на внешний сервер при каждом запуске. Также это не требует установку внешнего сервера приложений.

Для большинства случаев достаточно загрузить библиотеки сервера, зарегистрировать их в Eclipse как библиотеку пользователя и далее использовать ссылку на эту библиотеку. Этот подход прост для начинающих Java программистов так как не требует наличия и навыков инструментария автоматизации сборки, такого как Maven или Gradle.

Установить необходимые библиотеки Jetty в Eclipse можно следующим образом:

1. Загрузим сжатый файл по ссылке http://download.eclipse.org/jetty/ и распакуем его;

2. В корневой папке проектов ( обычно это Workspace ) создадим папку jars, а в ней папку jetty;

3. Скопируем содержимое папки lib из распакованного ранее файла в созданную папку jetty;

4. В меню Window/Preferences выберем раздел Java/Build Path/User Libraries.

5. Кликнем кнопку New…, введём имя библиотеки jetty и кликнем кнопку ОК.

6. Далее при выделенной только что созданной библиотеке jetty в окошке Preferences кликнем кнопку Add External JARs…. В окне JAR Selection выберем все JAR-файлы из ранее созданной папки jars/jetty.

7. В итоге JAR-файлы будут загружены в пользовательскую библиотеку jetty. Хотя файлы, находящиеся в под-папках не будут загружены, для большинства случаев в них нет необходимости.

Создание проекта веб сервера

В меню File/New выберем Dynamic Web Project. В поле Project name введём SCalculator. Нажмём кнопку Finish.

Добавление ссылки на библиотеку jetty

Сразу после создания проект не содержит ссылку на библиотеку jetty. Подключённые библиотеки можно просмотреть в Project Explorer во вкладке Java Resources, в под-вкладке Libraries.

Кликнем правой кнопкой мыши на метку проекта и в контекстном меню выберем Build Path и далее Configure Build Path…. Во вкладке Java Build Path на страничке Libraries кликнем кнопку Add Library….

Выберем User Library и кликнем Next. Выберем jetty и кликнем Finish.

В итоге после подтверждения включения пользовательской библиотеки jetty, наличие ссылки на нее можно увидеть в Project Explorer.

Создание сервлета калькулятора

Создание файла сервлета

Сервлет калькулятора будет содержать весь код декодирования входных данных, вычисления, и формирования ответа. Для создания сервлета кликнем правой кнопкой мыши на наименование проекта в панели Project Explorer, в контекстном меню выберем New и далее Servlet. В название класса введём SrvltCalculator и кликнем кнопку Finish.

В панели Project Explorer можно увидеть созданный файл SrvltCalculator.java. Его содержимое автоматически открывается в редакторе.

Удаление лишнего кода

Для упрощения дальнейшего редактирования файлов удалим неиспользуемые конструктор сервлета SrvltCalculator и метод doPost.

Добавление импортируемых модулей

Код, который будет добавлен в файл сервлета потребует добавления следующих ниже строк кода включения модулей. Добавим эти строки.

Добавление кода в метод doGet

Метод doGet содержит код обработки GET–запросов. В этом методе последовательно добавим приведённые ниже фрагменты кода.

Приём параметров в соответствующие строковые переменные.

Объявление переменных для принятия декодированных из строковых переменных числовых параметров a и b.

Объявление переменной контроля возникновения ошибки noError.

Попытка декодирования числовых параметров a и b из соответствующих строковых переменных. При ошибке декодирования переменная noError принимает значение “ложь”.

Открытие секции кода для случая, если при декодировании числовых параметров ошибка не возникла.

Объявление числовой переменной result для хранения результата.

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

Для случая операции сложения, вызываем функцию functionSum, которую опишем позднее.

Для случая операции вычитания, вызываем функцию functionDif, которую опишем позднее.

Для случая операции умножения, вызываем функцию functionMul, которую опишем позднее.

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

Читайте также:  что делать если вечером очень хочется есть а нельзя

После проверки всех четырёх операций устанавливаем флажок отсутствия ошибки в “ложь”. Это делается для идентификации того, что арифметическая операция не идентифицирована.

Закрываем блок try с установлением флажка отсутствия ошибки в “ложь” в случае возникновения исключительной ситуации.

В случае если ошибки не возникло, отсылаем результат методом doSetResult, который опишем ниже. Так как работа метода doGet на этом завершается, возвращаемся оператором return.

Закрываем секцию, начатую оператором “if ( noError ) <“:

Так как при обработке запроса где-то произошла ошибка и функция doGet не возвратила управление с успешным вычислением, возвращаем сообщение об ошибке методом doSetError, который опишем ниже.

Междоменные запросы

Междоменные запросы ( также такие запросы называются кроссдоменными / cross domain ) имеют место при запросах с веб страниц, расположенных вне сетевого домена обслуживающего сервера. Ответы на подобные запросы обычно блокируются для противостояния меж-доменным атакам. Для отключения блокировки в ответах сервера можно установить заголовок Access-Control-Allow-Origin:*.

Метод doSetResult

Метод doSetError

Методы реализации арифметических операций

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

Исходный код программы можно найти в репозитории GitHub.

Создание основного класса

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

Для создания основного класса приложения кликнем правой кнопкой на наименовании проекта в панели Project Explorer, в контекстном меню выберем New и далее Class. В название класса введём Main. Установим флажок для создания статической функции main и кликнем кнопку Finish.

Так же как и в случае сервлета создаётся и открывается в текстовом редакторе соответствующий файл.

Добавление импортируемых модулей

Код, который будет добавлен в файл основного класса приложения потребует добавления следующих ниже строк кода включения модулей. Введём эти строки.

Добавление кода в метод main

Код метода main начинается с объявления переменной port и присваивания ей номера порта, который будет слушать сервер. Такой подход позволит быстро и легко изменить порт в случае необходимости в случае дальнейшего роста программы.

Создаем класс сервера.

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

Указываем серверу обработчик запросов.

Пробуем запустить сервер. Для того, чтобы работа программы не прекратилась, ждём завершения процесса сервера главным потоком посредством вызова server.join(). В случае возникновения ошибки печатается соответствующее сообщение.

Исходный код программы можно найти в репозитории GitHub.

Доступ к сервису из браузера

Запуск сервера

При запуске сервера Eclipse может предложить два варианта. Так как сервер содержит полноценный сервлет, то программа может быть запущена на сервере приложений, таком как к примеру Tomcat или самостоятельный Jetty. Однако так как мы встроили jetty в приложение, оно может работать самостоятельно – как Java Application.

После запуска приложение выдаёт соответствующие уведомления и строку Listening port: port, указывающую что наш сервер запущен и ждёт запросов.

Посылка запросов посредством браузера

Наиболее простой способ проверить функциональность сервера – обратиться к нему посредством браузера.

При посылке строки запроса, такой как http://localhost:8080/func?a=8.78&b=4.15&op=+ напрямую, сервер выдает ошибку. Дело в том, что строка не соответствует стандарту запросов и должна быть кодирована как URL ( символ + не допустим ).

После кодирования все работает без ошибки. Символ + кодирован URL как %2B, что делает запрос соответствующим стандарту. В интернете имеется множество он-лайн кодировщиков/де-кодировщиков URL, которыми можно воспользоваться для этой цели.

Аналогичным способом можно проверить ответы сервера на другие запросы.

Клиенты сервера

Клиент – веб страница

Специализированная веб страница – простой тип клиентского приложения.

HTML код страницы можно найти в репозитории GitHub.

Создание запускаемого модуля

Созданный сервер можно оформить как единый независимый запускаемый JAR-файл. Такой файл будет требовать только наличия установленной среды выполнения Java и запускаться из любой папки файловой системы. Для создания такого файла кликнем правой кнопкой мыши на наименовании проекта в панели Project Explorer, в контекстном меню выберем Export и далее Export…. В секции Java выберем Runnable JAR file и кликнем кнопку Next.

В настройках создаваемого JAR-файла указываем Launch configuration как Main-SCalculator, полное имя экспортируемого файла и флажок упаковки необходимых модулей в этот файл.

Запуск правильно созданного JAR-файла с именем SCalculator осуществляется простой командой (при запуске из той же папки, где он находится):

Также возможен запуск сервера двойным кликом мыши на JAR-файле.

Итоги

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

Ссылки

Подробнее о встраивании Jetty в приложение можно почитать по ссылке http://docs.codehaus.org/display/JETTY/Embedding+Jetty

Представленный материал основан на использовании Eclipse Luna for Java EE Developers и Ubuntu 14.04.

Источник

Сказочный портал