Хотя я давно использую 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, чтобы он начинался со следующего объявления пространств имен:
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
|
<? 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 .