在Maven中配置内嵌Jetty

Maven中约定优于配置,所以最好使用Maven建议的项目结构。你可以使用Archetypes来快速创建Maven项目,但在本教程中,我们将手工建立项目结构:

mkdir JettyMavenHelloWorld
cd JettyMavenHelloWorld
mkdir -p src/main/java/org/example

创建HelloWorld类

使用编辑器创建文件src/main/java/org/example/HelloWorld.java,并填入下面的内容:

package org.example;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import java.io.IOException;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.AbstractHandler;

public class HelloWorld extends AbstractHandler
{
    public void handle(String target,
                       Request baseRequest,
                       HttpServletRequest request,
                       HttpServletResponse response) 
        throws IOException, ServletException
    {
        response.setContentType("text/html;charset=utf-8");
        response.setStatus(HttpServletResponse.SC_OK);
        baseRequest.setHandled(true);
        response.getWriter().println("

Hello World

");     }     public static void main(String[] args) throws Exception     {         Server server = new Server(8080);         server.setHandler(new HelloWorld());           server.start();         server.join();     } }

创建POM描述文件

pom.xml文件声明了项目名称和项目使用的依赖。使用编辑器创建文件pom.xml,并填入下面的内容:



  4.0.0
  org.example
  hello-world
  0.1-SNAPSHOT
  jar
  Jetty HelloWorld

  
    7.2.0.v20101020
  

  
    
      org.eclipse.jetty
      jetty-server
      ${jettyVersion}
    
  

  
    
      
        
        org.mortbay.jetty
        jetty-maven-plugin
        ${jettyVersion}
      
      
        org.codehaus.mojo
        exec-maven-plugin
        1.1
        
          java
        
        
          org.example.HelloWorld
        
      
    
  

构建并运行内嵌的HelloWorld程序

现在,你可以通过下面的命令编译并运行HelloWorld class:

mvn clean compile exec:java

现在你可以打开浏览器输入http://localhost:8080来看看你的hello world页面。你可以通过mvn dependency:tree命令查看Maven在幕后都为你做了什么 ,它解决了传递性依赖的问题:

> mvn dependency:tree
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'dependency'.
[INFO] ------------------------------------------------------------------------
[INFO] Building Jetty HelloWorld
[INFO]    task-segment: [dependency:tree]
[INFO] ------------------------------------------------------------------------
[INFO] [dependency:tree {execution: default-cli}]
[INFO] org.example:hello-world:jar:0.1-SNAPSHOT
[INFO] \- org.eclipse.jetty:jetty-server:jar:7.0.1.v20091125:compile
[INFO]    +- javax.servlet:servlet-api:jar:2.5:compile
[INFO]    +- org.eclipse.jetty:jetty-continuation:jar:7.0.1.v20091125:compile
[INFO]    \- org.eclipse.jetty:jetty-http:jar:7.0.1.v20091125:compile
[INFO]       \- org.eclipse.jetty:jetty-io:jar:7.0.1.v20091125:compile
[INFO]          \- org.eclipse.jetty:jetty-util:jar:7.0.1.v20091125:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4 seconds
[INFO] Finished at: Tue Feb 16 16:19:08 EST 2010
[INFO] Final Memory: 11M/68M
[INFO] ------------------------------------------------------------------------

使用Jetty和Maven开发标准的web应用程序

上面的例子展示了如何运行hello world示例做为一个内嵌的Jetty handler。下面的例子展示了使用Maven和Jetty如何开发一个标准的web应用程序。首先创建Maven项目结构:

mkdir JettyMavenHelloWarApp
cd JettyMavenHelloWebApp
mkdir -p src/main/java/org/example
mkdir -p src/main/webapp/WEB-INF

创建静态内容

一个web应用程序可以包含静态内容,所以创建文件src/main/webapp/index.html,并填入下面内容:

Hello World Webapp

Hello Servlet

创建Servlet

使用编辑器创建文件src/main/java/org/example/HelloServlet.java,并填入下面内容:

package org.example;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloServlet extends HttpServlet
{
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        response.setContentType("text/html");
        response.setStatus(HttpServletResponse.SC_OK);
        response.getWriter().println("

Hello Servlet

");         response.getWriter().println("session=" + request.getSession(true).getId());     } }

这个servlet必须在部署描述符中声明,所以编辑文件src/main/webapp/WEB-INF/web.xml,并填入下面内容:



  
    Hello
    org.example.HelloServlet
  
  
    Hello
    /hello/*
  

构建并运行web应用程序

现在使用下面命令构建并运行web应用程序:

mvn jetty:run

你可以在http://localhost:8080/hello-world/hello看到静态和动态内容。url中的应用上下文("hello-world")来自pom.xml文件的artifact ID。

构建WAR文件

你可以通过下面命令创建一个web应用存档文件(Web Application Archive简称WAR):

mvn package

由此产生的war文件在target目录中,这个文件可以部署到任何标准的servlet服务器中或部署到jetty中。