如何使用Java,Maven,Jetty创建Web应用程序项目

在本文中,我们使用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文件的名称。 在finalNamesimple-webapp ,打包阶段在target/simple-webapp.war生成一个WAR文件。

接下来,您需要配置

  1. 适用于目标Java版本的Maven Compiler插件(本文中的JDK 8)
  2. Java Servlet依赖性。
  3. 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.xmlweb.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-guimanager-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,更改插件artifactIdpom.xmltomcat6-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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值