Статьи

Использование плагина Maven Jetty

Хотя я давно использую 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 for projects...
[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 in Interactive mode
Downloading: http://artifactory.redstream.nl/repo/org/apache/maven/archetypes/maven-archetype-webapp/1.0/maven-archetype-webapp-1.0.jar
Downloaded: 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.pom
Downloaded: 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.pascalalma
Confirm properties configuration:
groupId: net.pascalalma
artifactId: rest-service
version: 1.0.0-SNAPSHOT
package: net.pascalalma
 Y: : Y
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating 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 in dir: /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
package net.pascalalma.servlets;
 
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
/**
 *
 * @author pascal
 */
public class TestRestServlet extends HttpServlet {
 
    public void doGet(HttpServletRequest request,
            HttpServletResponse response)
            throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        out.println('GET method called');
        out.println('parameters:\n ' + parameters(request));
        out.println('headers:\n ' + headers(request));
    }
 
    public void doPost(HttpServletRequest request,
            HttpServletResponse response)
            throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        out.println('POST method called');
        out.println('parameters: ' + parameters(request));
        out.println('headers: ' + headers(request));
    }
 
    public void doDelete(HttpServletRequest request,
            HttpServletResponse response)
            throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        out.println('Delete method called');
    }
 
    private String parameters(HttpServletRequest request) {
        StringBuilder builder = new StringBuilder();
        for (Enumeration e = request.getParameterNames(); e.hasMoreElements();) {
            String name = (String) e.nextElement();
            builder.append('|' + name + '->' + request.getParameter(name)+'\n');
        }
        return builder.toString();
    }
 
    private String headers(HttpServletRequest request) {
        StringBuilder builder = new StringBuilder();
        for (Enumeration e = request.getHeaderNames(); e.hasMoreElements();) {
            String name = (String) e.nextElement();
            builder.append('|' + name + '->' + request.getHeader(name)+'\n');
        }
        return builder.toString();
    }
}

И настройте сервлет в «web.xml». Кстати, сгенерированный файл «web.xml» не мог быть показан в моей версии Netbeans (v7.2.1). Я получил сообщение:

Версия веб-приложения не поддерживается. Обновите web.xml до версии 2.4 или новее или используйте предыдущую версию NetBeans

Чтобы это исправить, я изменил файл web.xml, чтобы он начинался со следующего объявления пространств имен:

Затем добавьте сервлет в измененный файл «web.xml»:

01
02
03
04
05
06
07
08
09
10
11
12
<?xml version='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 [email protected]: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 called
parameters:
|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 .