Самая чистая конфигурация причала для разработки?
-
12-11-2019 - |
Вопрос
Редактировать:Я думаю, мне следует прояснить свое намерение...
Я пытаюсь упростить цикл итерации разработки write-code>> build WAR >> deploy >> refresh >> repeat.Я бы хотел быть относительно независимым от IDE (т. Е. я не хочу, чтобы плагины Eclipse или IntelliJ выполняли эту работу).Я хочу иметь возможность редактировать код / статические файлы и создавать по мере необходимости в моем исходном каталоге WAR, и просто запустить / отладить установку как вызов командной строки для централизованной установки Jetty.
Позже я хотел бы иметь возможность выполнить фактическое развертывание, используя, как правило, те же настройки, но с упакованным WAR.Я не хочу, чтобы код моего приложения был привязан к моей IDE или Jetty.
Так что, возможно, лучший способ задать этот вопрос - Какой вы нашли самый чистый способ использовать Jetty в качестве сервера приложений для разработки / отладки?
Допустим, я хочу иметь минимальную установку Jetty 7.Я хочу как можно меньше настраивать XML, мне просто нужен необработанный Servlet API, без JSP, без фильтрации и т.д.Я просто хочу иметь возможность иметь несколько пользовательских сервлетов и обслуживать статические файлы, если они существуют.Это будет единственная война, и она будет использоваться как root для данного порта.
В идеале, для простоты развертывания я бы хотел, чтобы каталог Jetty был просто стандартной загрузкой, а моя конфигурация WAR / XML была отделена от этих стандартных файлов Jetty.В моем вызове Jetty я хотел бы передать этот минимальный XML-файл и перейти.
Я обнаружил, что документация есть повсюду, и большая ее часть предназначена для Jetty 6 или специфична для различных других пакетов (Spring и т.д.).Я полагаю, что если у меня будет эта минимальная конфигурация, то добавление дополнительных абстракций сверху будет намного чище.Кроме того, это позволит мне более четко работать со сценариями встроенных причалов.
Этот вопрос SO является примером сценария, в котором этот XML был бы полезен Jetty Запускает War, Используя только командную строку
Каким был бы минимальный XML, необходимый для указания этого единственного местоположения WAR и хостов / портов для его обслуживания?
Заранее благодарю за любые фрагменты или ссылки.
Решение
Jetty перекочевал в Eclipse.На этот счет есть очень тонкая информация.Это также привело к изменению названия пакета, что является еще одним нюансом.Они опубликовали утилиту для преобразования настроек Jetty6 в настройки Jetty 7, но опять же - не очень популярную.Я разочарован форумом Eclipse Jetty.Вот где вам следует искать документацию по Jetty 7 и далее http://wiki.eclipse.org/Jetty/Starting
Я думаю, что это минимальный jetty.xml
взято из http://wiki.eclipse.org/Jetty/Reference/jetty.xml
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">\
<Configure id="Server" class="org.eclipse.jetty.server.Server">
</Configure>
Но я бы предпочел начать с копии $JETTY_HOME/etc/jetty.xml
и будет вносить изменения оттуда.
Если вас устраивает $JETTY_HOME/webapps
каталог, вы можете настроить порт, изменив эту часть
<Configure id="Server" class="org.eclipse.jetty.server.Server">
...
<Call name="addConnector">
<Arg>
<New class="org.eclipse.jetty.server.nio.SelectChannelConnector">
<Set name="host"><Property name="jetty.host" /></Set>
<Set name="port"><Property name="jetty.port" default="7777"/></Set>
<Set name="maxIdleTime">300000</Set>
<Set name="Acceptors">2</Set>
<Set name="statsOn">false</Set>
<Set name="confidentialPort">8443</Set>
<Set name="lowResourcesConnections">20000</Set>
<Set name="lowResourcesMaxIdleTime">5000</Set>
</New>
</Arg>
</Call>
....
</Configure>
В противном случае я внесу изменения context.xml
способ, описанный здесь (для причала 7) Как обслуживать webapp A из portA и webapp B из portB
Также обратитесь к этим страницам:
- http://wiki.eclipse.org/Jetty/Reference/jetty.xml
- http://wiki.eclipse.org/Jetty/Reference/jetty.xml_syntax
- http://communitymapbuilder.org/display/JETTY/JNDI
....Правка №1:извините за неправильный URL для webapp для каждого соединителя.Я обновил ссылку на Как обслуживать webapp A из portA и webapp B из portB указать на документ, предназначенный для Jetty 7.
Обновить на тему "как вы справляетесь с Jetty в различных условиях?"
Дев
Мы используем Maven, поэтому встроенный Jetty работает у нас.Мы просто бежим mvn clean install run:jetty
и порт настроен в конфигурационном файле Maven, а именно pom.xml
.Это нет IDE dependent plus Jetty можно легко встроить с помощью ANT, но я никогда не пробовал.
Тест
У нас работает автономный причал.Я настроил порт и настроил параметры, удалил приложения по умолчанию (напримерroot.war и т.д.) и создал context.xml с портами для конкретного приложения и каталогом развертывания.(К сожалению, я задавал этот вопрос в списке рассылки Eclipse Jetty, и никто не потрудился ответить).Это одноразовая настройка.
Для тестовых сборок / развертываний у нас есть скрипт сборки, который создает WAR в соответствии со спецификациями тестовой среды, а затем загружает его в тестовую среду.После этого мы вызываем сценарий оболочки, который (1) останавливает Jetty, (2) копирует файл war в директорию веб-приложения MyApp и (3) перезапускает Jetty.
Однако более простой способ сделать это - использовать плагин Cargo от Maven.Неудача заключалась в том, что я использовал Jetty 7.1.6, который был несовместим с грузом.Позже они это исправили, но я выполнил свою работу с помощью пользовательского сценария.
Подталкивать
Prod имеет почти ту же процедуру, что и test, за исключением.Настройки выполняются для повышения безопасности и балансировки нагрузки.Но с точки зрения развертывания POV, нет ничего отличного от тестового примера для Prod.
Обратите внимание, что я не беспокоился о том, что такое XML-файлы и сколько их должно быть.Я только что использовал те, которые вызывают у меня беспокойство -- jetty.xml
и context.xml
.Кроме того, я обнаружил, что он намного чище в использовании jetty.conf
и jetty.sh
для передачи параметров JVM, пользовательских XML-файлов, а также для запуска и остановки.
Надеюсь, это поможет.
При горячем развертывании:
Теперь, если вы используете Maven и используете встроенный Jetty.Он просто знает, когда код изменен - например, "gunshot sniffer".В dev envt вы запускаете Jetty, вносите изменения, обновляете страницу и видите свои изменения -- горячее развертывание.Подробнее читайте здесь http://docs.codehaus.org/display/JETTY/Maven+Jetty+Plugin ищите scanIntervalSeconds
Другие советы
Это не дает полного ответа на ваш вопрос, но на случай, если это поможет, вот несколько довольно минимальных кодов, использующих встроенный Jetty 7 для запуска сервера с одним корневым сервлетом:
HandlerCollection handlers = new HandlerCollection();
ServletContextHandler root = new ServletContextHandler(handlers, "/", ServletContextHandler.NO_SESSIONS|ServletContextHandler.NO_SECURITY);
root.addServlet(new ServletHolder(new MyServlet()), "/*");
Server server = new Server(8080);
server.setHandler(handlers);
server.start();
Видеть, конечно http://wiki.eclipse.org/Jetty/Tutorial/Embedding_Jetty.
Если вы создаете с помощью maven (который не зависит от IDE), то вам следует выполнять отладку с помощью плагина maven jetty.По сути, вы запускаете приложение как "mvn jetty: run" в командной строке, и все это просто работает без необходимости выполнять какое-либо перераспределение.Большинство хороших IDE имеют встроенную поддержку maven и позволяют запускать / отлаживать приложение как maven;это означает, что запускается maven, который запускает плагин jetty, который запускает приложение, и вы можете отлаживать его.Поскольку все работает из папок IDE source и bin, вам даже не нужно устанавливать сервер jetty.
Вот демонстрационный проект, который работает таким образом https://github.com/simbo1905/ZkToDo2/blob/master/commandline.build.and.run.txt и вот как запустить его в eclipse https://github.com/simbo1905/ZkToDo2/blob/master/eclipse.indigo.build.and.debug.txt но любая IDE, которая понимает maven, должна работать.Взгляните на pom.xml, где он устанавливает плагин maven jetty.
Я бы использовал Gradle и каждые несколько секунд сканировал выходную папку сборки на предмет изменений в сборке.
В файле build.gradle:
apply plugin: 'jetty'
...
jettyRun.doFirst {
// set system properties, etc here for bootstrapping
}
jettyRun {
httpPort = 8989
reload = 'automatic'
scanIntervalSeconds = 3
daemon = false
}
Вот и все.Вы можете выбрать автоматическую сборку IDE для себя и указать на этот каталог.Но вы также можете отказаться от этого.Это решение вообще не привязано к IDE.
Я подумал, что расскажу о том, что я сейчас делаю.Я написал крошечное приложение командной строки / Maven archetype, которое работает примерно так, как, по моему мнению, все это должно было быть в первую очередь.Приложение bootstrap позволяет вам запустить выбранный вами контейнер сервлета (Jetty, Tomcat, GlassFish), просто передав ему путь к WAR и ваш порт.
Используя Maven, вы можете создать и упаковать свой собственный экземпляр этого простого приложения:
mvn archetype:generate \
-DarchetypeGroupId=org.duelengine \
-DarchetypeArtifactId=war-bootstrap-archetype \
-DarchetypeVersion=0.2.1
Затем вы запускаете его следующим образом:
java -jar bootstrap.jar -war myapp.war -p 8080 --jetty
Вот исходный код утилиты и архетип: https://bitbucket.org/mckamey/war-bootstrap