Вопрос

Редактировать:Я думаю, мне следует прояснить свое намерение...

Я пытаюсь упростить цикл итерации разработки 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

Также обратитесь к этим страницам:

....Правка №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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top