在本文中,我们使用Maven Archetype插件创建一个简单的Web应用程序。 我们将在名为Jetty的Servlet容器中运行此Web应用程序,添加一些依赖项,编写简单的Servlet,并生成WAR文件。 在本文的最后,您还可以在Tomcat中部署该服务。
系统要求
- Java SE开发套件8
- Maven 3.3.3
逐步创建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 {@Overridepublic void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doPost(request, response);}@Overridepublic 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:重新部署
翻译自: https://www.javacodegeeks.com/2015/08/how-to-create-a-web-application-project-with-java-maven-jetty.html