maven项目 jetty
在本文中,我们使用Maven Archetype插件创建一个简单的Web应用程序。 我们将在一个名为Jetty的Servlet容器中运行此Web应用程序,添加一些依赖项,编写简单的Servlet,并生成WAR文件。 在本文的结尾,您还可以在Tomcat中部署该服务。
系统要求
逐步创建Web服务
本节说明如何从EMPTY文件夹创建此简单的Web项目。
创建简单的Web项目
创建您的Web应用程序
$ mvn archetype:generate -DgroupId=com.pengyifan.simpleweb \
-DartifactId=simple-webapp \
-Dpackage=com.pengyifan.simpleweb \
-DarchetypeArtifactId=maven-archetype-webapp \
-Dversion=1.0-SNAPSHOT \
-DinteractiveMode=false
...
[INFO] BUILD SUCCESS
Maven Archetype插件创建项目后,将目录更改为simple-webapp
目录,并查看pom.xml
。 您应该看到
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.pengyifan.simpleweb</groupId>
<artifactId>simple-webapp</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>simple-webapp Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>simple-webapp</finalName>
</build>
</project>
请注意,包装元素包含值war
。 这种打包类型是配置Maven以在WAR文件中生成Web应用程序存档的方式。 一个带有war包装的项目将在target
目录中创建一个WAR文件。 因此,该文件的默认名称为${artifactId}-${version}.war
。 在此Maven项目中,默认WAR将在target/simple-webapp-1.0-SNAPSHOT.war
。 此外,我们通过在该项目的构建配置中添加finalName
元素来定制生成的WAR文件的名称。 在finalName
为simple-webapp
,打包阶段在target/simple-webapp.war
生成一个WAR文件。
接下来,您需要配置
- 适用于目标Java版本的Maven Compiler插件(本文中的JDK 8)
- Java Servlet依赖性。
- Maven码头插件。
pom.xml
应该看起来像这样。 您也可以使用下载的软件包中的pom.xml
覆盖它。
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.pengyifan.simpleweb</groupId>
<artifactId>simple-webapp</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>simple-webapp Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.4</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>simple-webapp</finalName>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.26</version>
<configuration>
<connectors>
<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
<port>80</port>
</connector>
</connectors>
</configuration>
</plugin>
</plugins>
</build>
</project>
现在,您可以调用Jetty插件的Run目标,以在Jetty Servlet容器中启动Web应用程序。 跑:
$ mvn jetty:run
注意, mvn jetty:run
将继续运行Jetty servlet容器,直到您使用CTRL-C
停止该过程为止。
Maven启动Jetty Servlet容器后,在Web浏览器中加载URL http://localhost/simple-webapp/index.jsp 。 由Archetype生成的简单index.jsp
很简单; 它包含带有文本“ Hello World!”的第二级标题。 Maven希望将Web应用程序的文档根目录存储在src/main/webapp
。 在此目录中,您可以找到index.jsp
文件。
<h2>
Hello World!
</h2>
在src/main/webapp/WEB-INF
,我们将找到最小的Web应用程序web.xml
,如以下示例所示:
<web-app>
<display-name>Archetype Created Web Application</display-name>
</web-app>
添加一个简单的Servlet
仅具有一个页面且没有配置的servlet的Web应用程序几乎是无用的。 让我们向该应用程序添加一个简单的servlet,并对pom.xml
和web.xml
进行一些更改以支持此更改。 首先,我们需要在src/main/java
下创建一个名为com.pengyifan.web
的新包:
$ mkdir -p src/main/java/com/pengyifan/web
$ cd src/main/java/com/pengyifan/web
创建此程序包后,转到src/main/java/com/pengyifan/web directory
然后创建一个名为SimpleServlet
的类:
package com.pengyifan.web;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class SimpleServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
@Override
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println("SimpleServlet Executed");
out.flush();
out.close();
}
}
我们的SimpleServlet
类就是这样:一个servlet,它向响应的Writer
打印一条简单消息。 现在,我们需要将此servlet添加到您的Web应用程序并将其映射到请求路径。 您可以在src/main/webapp/WEB-INF
更改web.xml
。
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>simple</servlet-name>
<servlet-class>
com.pengyifan.web.SimpleServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>simple</servlet-name>
<url-pattern>/simple</url-pattern>
</servlet-mapping>
</web-app>
一切就绪,可以测试该servlet。 跑:
$ mvn clean install
...
$ mvn jetty:run
[INFO] [jetty:run]
...
[INFO] Started Jetty Server
此时,您应该能够检索SimpleServlet
的输出。 在Web浏览器中,您可以加载http:// localhost:8080 / simple-webapp / simple,并获取SimpleServlet Executed
。
更改端口
在源代码包中,我们使用端口80
。 在此任务中,我们建议您在端口80上侦听RESTful API。 但是我们仍然可以收听其他端口。 为此,请在pom.xml
文件中找到以下几行,然后在<port>
更改数字。
[...]
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.26</version>
<configuration>
<connectors>
<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
<port>80</port>
</connector>
</connectors>
</configuration>
</plugin>
[...]
出于安全原因,我们可能需要启用服务器与客户端之间的SSL通信。 因此,当我们运行mvn jetty:run
我们必须能够使用https
协议。 为了进行开发,我们可以创建自己的安全证书并配置插件以使用它。
要创建开发证书,我们运行以下命令:
keytool -genkey -alias jetty6 -keyalg RSA \
-keystore target/jetty-ssl.keystore \
-storepass jetty6 -keypass jetty6 \
-dname "CN=your name or domain"
输入-dname "CN="
选项的名称或域。 在Maven pom.xml
配置插件时,我们再次需要密钥库和密钥密码。 以下代码片段显示了Jetty插件如何支持SSL:
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<configuration>
<connectors>
<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
<port>8080</port>
</connector>
<connector implementation="org.mortbay.jetty.security.SslSocketConnector">
<port>8081</port>
<maxIdleTime>60000</maxIdleTime>
<keystore>${project.build.directory}/jetty-ssl.keystore</keystore>
<password>jetty6</password>
<keyPassword>jetty6</keyPassword>
</connector>
</connectors>
</configuration>
</plugin>
在connectors元素中,我们定义了用于在端口8080
上监听http和在端口8081
上监听https的连接器。 在<keystore>
,我们引用使用keytool
创建的密钥库文件。 <password>
和<keyPassword>
定义密码值。
要测试此配置,我们可以调用mvn jetty:run
并打开一个地址为https://localhost:8081/simple-webapp/
的Web浏览器。 我们一定不要忘记使用https作为协议。
我们使用Java开发工具包中的keytool
命令生成了密钥库。 但是有一个Maven插件可以做同样的事情,但是我们可以在POM中定义keytool的所有参数。 当我们运行mvn keytool:generateKeyPair
,将mvn keytool:generateKeyPair
密钥库,并使用mvn keytool:clean
可以再次删除密钥库。 如果要将密钥库的创建附加到Maven生成资源阶段,则必须首先确保我们调用keytool:clean
否则我们会从keytool中得到一个错误,指出指定的别名已经存在。 因此,我们可以将以下内容添加到我们的POM中:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>keytool-maven-plugin</artifactId>
<executions>
<execution>
<phase>generate-resources</phase>
<id>clean</id>
<goals>
<goal>clean</goal>
</goals>
</execution>
<execution>
<phase>generate-resources</phase>
<id>generateKeyPair</id>
<goals>
<goal>generateKeyPair</goal>
</goals>
</execution>
</executions>
<configuration>
<keystore>${project.build.directory}/jetty-ssl.keystore</keystore>
<dname>CN=BioCreative, OU=NLM, O=NIH, L=Bethesda, ST=DC</dname>
<keypass>jetty6</keypass>
<storepass>jetty6</storepass>
<alias>jetty6</alias>
<keyalg>RSA</keyalg>
</configuration>
</plugin>
现在我们可以调用mvn jetty:run
,并且keyty由Jetty插件自动生成和使用。
配置Tomcat
Tomcat身份验证
要把WAR文件部署到Tomcat中,要比Jetty困难一点。 首先,我们需要添加一个具有manager-gui
和manager-script
角色的用户。 在%TOMCAT_PATH%/conf/tomcat-users.xml
<tomcat-users>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<user username="admin" password="password"
roles="manager-gui,manager-script" />
</tomcat-users>
Maven认证
在Maven设置文件%MAVEN_PATH%/conf/settings.xml
,在Tomcat用户上方添加,以后Maven将使用该用户登录Tomcat服务器。
<settings ...>
<servers>
<server>
<id>TomcatServer</id>
<username>admin</username>
<password>password</password>
</server>
</servers>
</settings>
Tomcat Maven插件
在pom.xml
声明一个Maven Tomcat插件
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<url>http://localhost:8080/</url>
<server>TomcatServer</server>
<path>/biocreative</path>
</configuration>
</plugin>
在部署过程中,它告诉Maven使用http:// localhost:8080 /在路径/biocreative
WAR文件部署到Tomcat服务器,并使用“ TomcatServer”(在settings.xml
)用户名和密码进行身份验证。
部署到Tomcat
在Tomcat上操作WAR文件的命令。
- mvn tomcat7:部署
- mvn tomcat7:取消部署
- mvn tomcat7:重新部署
例如,
mvn tomcat7:deploy
Tomcat 6示例
如果你使用Tomcat 6,更改插件artifactId
中pom.xml
到tomcat6-maven-plugin
。 推荐行可能是
- mvn tomcat6:部署
- mvn tomcat6:取消部署
- mvn tomcat6:重新部署
maven项目 jetty