Хотя я давно использую Maven, я до недавнего времени никогда не использовал плагин Jetty . Чтобы иметь возможность протестировать REST- клиента, я создал сервлет, который показал мне все входящие параметры и заголовки с входящим запросом. Чтобы запустить сервлет в контейнере, я решил попробовать подключаемый модуль Maven Jetty . Итак, сначала я создаю веб-приложение, используя определенный архетип Maven:
| 1 | mvn archetype:generate -DgroupId=net.pascalalma -DartifactId=rest-service -Dversion=1.0.0-SNAPSHOT -DarchetypeArtifactId=maven-archetype-webapp | 
Это приводит к завершению проекта и следующей регистрации:
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | [INFO] Scanning forprojects...[INFO]                                                                         [INFO] ------------------------------------------------------------------------[INFO] Building Maven Stub Project (No POM) 1[INFO] ------------------------------------------------------------------------[INFO] [INFO] >>> maven-archetype-plugin:2.2:generate (default-cli) @ standalone-pom >>>[INFO] [INFO] <<< maven-archetype-plugin:2.2:generate (default-cli) @ standalone-pom <<<[INFO] [INFO] --- maven-archetype-plugin:2.2:generate (default-cli) @ standalone-pom ---[INFO] Generating project inInteractive modeDownloading: http://artifactory.redstream.nl/repo/org/apache/maven/archetypes/maven-archetype-webapp/1.0/maven-archetype-webapp-1.0.jarDownloaded: http://artifactory.redstream.nl/repo/org/apache/maven/archetypes/maven-archetype-webapp/1.0/maven-archetype-webapp-1.0.jar (4 KB at 5.2 KB/sec)Downloading: http://artifactory.redstream.nl/repo/org/apache/maven/archetypes/maven-archetype-webapp/1.0/maven-archetype-webapp-1.0.pomDownloaded: http://artifactory.redstream.nl/repo/org/apache/maven/archetypes/maven-archetype-webapp/1.0/maven-archetype-webapp-1.0.pom (533 B at 1.1 KB/sec)[INFO] Using property: groupId = net.pascalalma[INFO] Using property: artifactId = rest-service[INFO] Using property: version = 1.0.0-SNAPSHOT[INFO] Using property: package = net.pascalalmaConfirm properties configuration:groupId: net.pascalalmaartifactId: rest-serviceversion: 1.0.0-SNAPSHOTpackage: net.pascalalma Y: : Y[INFO] ----------------------------------------------------------------------------[INFO] Using following parameters forcreating project from Old (1.x) Archetype: maven-archetype-webapp:1.0[INFO] ----------------------------------------------------------------------------[INFO] Parameter: groupId, Value: net.pascalalma[INFO] Parameter: packageName, Value: net.pascalalma[INFO] Parameter: package, Value: net.pascalalma[INFO] Parameter: artifactId, Value: rest-service[INFO] Parameter: basedir, Value: /Users/pascal/projects[INFO] Parameter: version, Value: 1.0.0-SNAPSHOT[INFO] project created from Old (1.x) Archetype indir: /Users/pascal/projects/rest-service[INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------------[INFO] Total time: 13.057s[INFO] Finished at: Sun Feb 03 17:13:33 CET 2013[INFO] Final Memory: 7M/81M[INFO] ------------------------------------------------------------------------MacBook-Air-van-Pascal:projects pascal$ | 
Затем я добавил код сервлета в проект:
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | packagenet.pascalalma.servlets;importjava.io.IOException;importjava.io.PrintWriter;importjava.util.Enumeration;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;/** * * @author pascal */publicclassTestRestServlet extendsHttpServlet {    publicvoiddoGet(HttpServletRequest request,            HttpServletResponse response)            throwsServletException, IOException {        PrintWriter out = response.getWriter();        out.println('GET method called');        out.println('parameters:\n '+ parameters(request));        out.println('headers:\n '+ headers(request));    }    publicvoiddoPost(HttpServletRequest request,            HttpServletResponse response)            throwsServletException, IOException {        PrintWriter out = response.getWriter();        out.println('POST method called');        out.println('parameters: '+ parameters(request));        out.println('headers: '+ headers(request));    }    publicvoiddoDelete(HttpServletRequest request,            HttpServletResponse response)            throwsServletException, IOException {        PrintWriter out = response.getWriter();        out.println('Delete method called');    }    privateString parameters(HttpServletRequest request) {        StringBuilder builder = newStringBuilder();        for(Enumeration e = request.getParameterNames(); e.hasMoreElements();) {            String name = (String) e.nextElement();            builder.append('|'+ name + '->'+ request.getParameter(name)+'\n');        }        returnbuilder.toString();    }    privateString headers(HttpServletRequest request) {        StringBuilder builder = newStringBuilder();        for(Enumeration e = request.getHeaderNames(); e.hasMoreElements();) {            String name = (String) e.nextElement();            builder.append('|'+ name + '->'+ request.getHeader(name)+'\n');        }        returnbuilder.toString();    }} | 
И настройте сервлет в «web.xml». Кстати, сгенерированный файл «web.xml» не мог быть показан в моей версии Netbeans (v7.2.1). Я получил сообщение:
Версия веб-приложения не поддерживается. Обновите web.xml до версии 2.4 или новее или используйте предыдущую версию NetBeans
Чтобы это исправить, я изменил файл web.xml, чтобы он начинался со следующего объявления пространств имен:
| 1 2 3 4 5 | xsi:schemaLocation='http://java.sun.com/xml/ns/javaee  | 
Затем добавьте сервлет в измененный файл «web.xml»:
| 01 02 03 04 05 06 07 08 09 10 11 12 | <?xmlversion='1.0'encoding='UTF-8'?>...  <display-name>Archetype Created Web Application</display-name>  <servlet>    <servlet-name>TestRestServlet</servlet-name>    <servlet-class>net.pascalalma.servlets.TestRestServlet</servlet-class>  </servlet>  <servlet-mapping>    <servlet-name>TestRestServlet</servlet-name>    <url-pattern>/TestRestServlet</url-pattern>  </servlet-mapping>... | 
Теперь все готово для тестирования сервлета. Как я уже говорил, я собираюсь использовать плагин Jetty для этого. Чтобы добавить плагин в проект, просто поместите в ваш pom.xml следующее:
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 | <plugins>  <plugin>    <groupId>org.mortbay.jetty</groupId>    <artifactId>jetty-maven-plugin</artifactId>    <configuration>      <scanIntervalSeconds>10</scanIntervalSeconds>      <contextPath>/</contextPath>      <scanIntervalSeconds>10</scanIntervalSeconds>      <stopKey>STOP</stopKey>      <stopPort>8005</stopPort>      <port>8080</port>    </configuration>  </plugin></plugins> | 
Теперь я могу запустить команду «mvn jetty: run» в моем терминале, чтобы контейнер запускал сервлет. Журнал должен заканчиваться чем-то вроде:
| 1 2 3 4 | ....2013-02-19 09:54:53.044:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:8080[INFO] Started Jetty Server[INFO] Starting scanner at interval of 10 seconds.</code> | 
Теперь, если вы откроете браузер и перейдете по этому адресу http: // localhost: 8080 / TestRestServlet? Bla = true & # 8217 ; вы увидите сервлет в действии и выведите его в браузер:
| 1 2 3 | GET method calledparameters:|bla->true | 
| 01 02 03 04 05 06 07 08 09 10 | headers:|DNT->1|Host->localhost:8080|Accept->text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8|Accept-Charset->ISO-8859-1,utf-8;q=0.7,*;q=0.3|Accept-Language->en-US,en;q=0.8|User-Agent->Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17|Connection->keep-alive|Cache-Control->max-age=0|Accept-Encoding->gzip,deflate,sdch | 
Одно замечание: как вы можете видеть в конфигурации плагина, я добавил несколько дополнительных параметров для моего удобства. Поэтому контейнер будет каждые 10 секунд проверять наличие изменений в сервлете, поэтому мне не нужно перезапускать контейнер Jetty после каждого изменения сервлета. Чтобы остановить контейнер, теперь вы можете ввести команду ‘mvn jetty: stop -DstopPort = 8005 -DstopKey = STOP’ в другом терминальном сеансе. Кстати, убедитесь, что вы называете плагин «jetty-maven-plugin», а не «maven-jetty-plugin», потому что тогда вы будете использовать старую версию плагина, которая не принимает параметры конфигурации (да, очень путаю и расстраиваю как я узнал).
Ссылка: Использование плагина Maven Jetty от нашего партнера по JCG Паскаля Альмы в блоге Pragmatic Integrator .